预处理器是一些指令,指示编译器在实际编译之前所需完成的处理。
#define
define用于定义宏。宏是一个代码级的文本替换,因为替换发生在编译之前。
神奇的例子,来猜猜输出结果。
#define STR(s) #s //# 会给 s 加上双引号 "s"
#define CONCAT(x, y) x##y //## 是将x和y拼接在一起
#define X(a) a //带参数的宏
//main函数中
cout << STR(hello world) << endl;
cout << "CONCAT(1, 2) = " << CONCAT(1, 2) << endl;
CONCAT(in, t) i = 1;
cout << "i = " << i << ", type: " << typeid(i).name() << endl;
X(double) j = 3.14;
cout << "j = " << j << ", type: " << typeid(j).name() << endl;
输出:
hello world
CONCAT(1, 2) = 12
i = 1, type: int
j = 3.14, type: double
很有用的C++宏
这些宏对于打印错误日志很有用,可以定位到某个文本,某行,甚至程序的编译日期。
宏 |
描述 |
__LINE__ |
当前行 |
__FILE__ |
当前文件名 |
__DATA__ |
程序编译日期 |
__TIME__ |
程序编译时间 |
条件编译
简述了,确实要有点基础才能懂。不过没关系,后边有例子。
指令 |
描述 |
#ifdef XXX |
如果定义了宏XXX |
#ifndef XXX |
如果没有定义宏XXX |
#if XXX |
如果表达式XXX为真 |
#elif XXX |
否则,如果表达式XXX为真 |
#else |
否则 |
#endif |
结束标志 |
如果没有定义 XXX 这个宏,代码块有效;否则,代码块无效。
#ifndef XXX
//代码块
#endif
如果(1==1)为真,则代码块1有效,否则代码2有效。
#if (1==1)
//代码块1
#else
//代码块2
#endif