目录
问题:
代码:
结果:
条件编译
分析代码:
运行代码:
问题:
编写包含变量和变量的字符串是很乏味的,而且比较死板。
例如输出c = 1,C++ 写法就是cout << "c = " << c << endl;
要是我想输出b = 3,就还需要改代码。
今天再看C++编程思想中的断言(assert)的时候发现一个#号运算符,学了这么多年C++从来没有注意过,原来标准C语言还有这么好用的运算符,把变量和表达式转换成字符串。
-----------------------------------------------------------------------------------------------------------------------
标准C语言具有字符串化运算符‘#’,在预处理器宏中的参数面前使用一个#,预处理器会把这个参数转化为一个字符数组。把这一点与没有插入标点符号的若干数组结合而连接成为一个字符数组。能够生成一个十分方便的宏,用于调试期间打印出变量的值。
---书中原话(不知道是我阅读理解能力不行,还是老外跟国人思维不同,还是说翻译的问题,我真的没读懂,真的不如用代码实验理解的快)
------------------------------------------------------------------------------------------------------------------------
代码:#include
#define PR(x) std::cout << #x " = " << x << std::endl;
int main()
{
int a = 1, b = 2, c = 3;
PR(a);
PR(b);
PR(c);
PR(a + b);
PR((c - a) / b);
return 0;
}
结果:
这个宏函数还是很好用的,虽然用的不多,但是以后调试代码的时候可以调用查看变量值比较方便。
条件编译常用的条件编译
#if | 如果条件为真,编译下面代码 |
#elif | 如果前面条件为假,当前条件为真,编译下面代码 |
#ifdef | 如果定义了宏 |
#ifndef | 如果没有定义宏 |
#endif | 解说上面所有的条件编译 |
#define | 宏定义 |
#undef | 接触宏定义 |
#error | 终止编译并显示错误 |
注意一点不管#if 还是#elif , #ifdef #ifndef 后面跟着的都是宏定义,不能是变量。因为这些都是需要在预编译器下进行的。而变量是在编译下才开始的。
#include
#define AA 0
#define BB
#define PR(x) std::cout << #x " = " << x << std::endl;
int main()
{
int a = 1, b = 2, c = 3;
#if AA == 0
PR(a);
#elif AA == 1
PR(b);
#endif
#ifdef BB
PR(c);
#endif // BB
#ifndef CC
PR(a + b);
#endif // !CC
#undef BB
#ifdef BB
PR((c - a) / b);
#endif // BB
return 0;
}
分析代码:
首先定义了宏 AA并且宏的值为1,定义了宏BB 没有定义宏CC
在条件编译下
#if AA == 0是成立的所以会把PR(a);编译进去。
# if AA == 1不成立,所以PR(b);不会编译到代码中。
第一个#endif是结束#if和#elif的条件编译
因为定义了宏 BB
所以#ifdef BB条件为真,所以会编译PR(C);
第二个#endif是结束#ifdef
因为没有宏CC
#ifndef CC条件成立所以会编译 PR(a + b);
#undef BB 解除BB的宏定义,所以#ifdef BB 条件为假所以不会编译PR((c-a)/b);
运行代码:欢迎分享,转载请注明来源:内存溢出
评论列表(0条)