• 宏与预处理


    #include 导入头文件
    #if if判断操作符
    #elif else if
    #else else
    #endif 结束if
    #define 定义一个宏
    #ifdef 如果定义了这个宏
    #ifndef 如果没有定义这个宏
    #undef 取消宏定义
    #pragma 设定编译器的状态

    #include 
    using namespace std;
    
    // 解决循环拷贝的问题,互相导入文件循环拷贝
    #ifndef CPPCLIONPROJECT_SAFE_QUEUE_TOO_H  // 如果没有定义这个宏   一个if
    #define CPPCLTONPROJECT_SAFE_QUEUE_TOO_H  // 定义一个宏
    //第一次进来没问题
    //第二次引用进来上门的宏判断就过不去,直接结束。
    // 假设有几百行代码在这
    
    
    #ifndef isRelease // 如果没有isRelease 这个宏     二个if
    #define isRelease 0 //是否是正式环境 我就定义isRelease这个宏并且赋值0
    
    #if isRelease == false 三个if
    #define DEBUG// 测试环境下 
    
    // 三个结束endif
    #endif // 结束里面的if
    #endif // 结束里面的if
    #endif //CPPCLTONPROJECT_SAFE_QUEUE_TOO_H // 属于if范畴必须 结束if
    
    
    
    
    #pragma once //防止重复写include的控制
    
    
    int main(){
    #if	1
    	cout << "真" << endl;
    #elif 0
    	cout << "假" << endl;
    #endif
    	cout << "只要有if判断就必须写结束endif结束的宏" << endl;
    
    #if DEBUG //是否定义了DEBUG这个宏
    	cout << "测试环境" << endl;  // 前面定义了DBUEG宏,所以输出这个
    #else RELEASE
    	cout << "正式环境" << endl;
    #endif // 结束
    
    #ifndef ABCD // 如果没有这个宏就定义这个宏
    #define ABCD // 定义这个宏
    #ifdef ABCD  //是否定义了这个宏
    	for (int i = 0; i < 6; ++i) {
    		cout << "abcd 1" << endl;
    	}
    
    #undef ABCD // 取消这个宏,下面的代码就相当于没有定义ABCD这个宏了
    #endif
    #endif
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    宏预处理和替换

    先简单了解C++的大概步骤

    #include 
    using namespace std;
    // 假如上面的宏的定义在一个文件T1.h中
    // 导入该文件,C++第一步预处理就是相当于把上面的那些代码copy到这里,这就是预处理
    #include T1.h
    
    #define a 1
    
    int main(){
    	// 执行第一步的时候进行宏替换,上面定义了a =1
    	// 下面的代码会直接变成 int i = 1,这就是宏替换
    	int i = a;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    宏变量与宏函数

    #include 
    using namespace std;
    // 在真实开发中,宏都是大写
    #define VALUE_I 9527
    #define VALUE_S "AAA"
    #define VALUE_F 545.3F
    
    //宏函数
    #define SHOW(V) COUT << V << endl;
    
    #define ADD(n1,n2) n1 + n2
    
    //宏函数的注意事项
    #define CHE(n1, n2) n1*n2
    
    
    #define LOGIN(V) if(V==1) { 	\
    	cout << "满足" << endl;		\
    } else {						\
    	cout << "不满足" << endl; 	\	
    }// \是换行, 这个是结尾,不需要加 \
    
    int main(){
    	// 预处理界面,宏会直接完成文本替换工作
    	int i = VALUE_I;
    	string s = VALUE_S;
    	float f = VALUE_F;
    	
    	//类似模板函数,根据你的类型变化而变化
    	SHOW(8);
    	SHOW(8.0F);
    	SHOW(8.99);
    	int r = ADD(1,2);
    	cout << r << endl;
    	r = ADD(1+1,2+2);// 6
    	
    	// 我们认为是8,其实r = 5
    	// 文本替换之后 1+1*2+2 = 5
    	r = CHE(1+1,2+2); 
    
    	// 宏函数优点,不会有函数进栈弹栈,直接是文本替换
    	// 缺点,文本替换导致体积增大,调用一次是文本替换一次
    	LOGIN(0);
    	LOGIN(0);
    	LOGIN(0);
    	LOGIN(0);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
  • 相关阅读:
    Linux环境下的Java(JDBC)连接openGauss数据库实践
    Android 系统启动 <init 进程> 笔记【1】
    【机器学习】机器学习重要方法—— 半监督学习:理论、算法与实践
    java8日期时间格式化与解析
    CAN总线隔离器 插入式CAN总线隔离器
    Vue3配置router路由步骤
    Linux 进程信号
    【MATLAB第75期】#源码分享 | 基于MATLAB的不规则间隔数据插值实现时间序列数据扩充(更新中)
    7. RxJava总结
    AlCl -氯铝酸离子液体|FeCl -氯铁酸离子液体|ZnCl-氯锌酸离子液体金属络合系列离子液体
  • 原文地址:https://blog.csdn.net/qq_34606099/article/details/126430297