CPlusPlus中的预定义和宏定义
宏定义中的变长参数以及__VA_ARGS__宏
示例:
//定义
#define LOG(...) {\
printf("%s : Line %d:\t", __FILE__, __LINE__); \
printf(__VA_ARGS__);\
printf("\n"); \
}
//调用
int x = 3;
LOG("x = %d", x);
//输出
..\main.cpp : Line 16: x = 3
可以看到__FILE__展开成成字符串,指示出当前代码所在文件。__LINE__展开成int型,指示当前所在行号。__VA_ARGS__被"…"符号原样代替,保持原来的数据类型
宏__cplusplus
在生成库的工程中常常能看到如下的代码
#ifdef __cplusplus
extern "C" {
#endif
//一些代码
#ifdef __cplusplus
}
#endif
__cplusplus宏其实是一个整型值,可以用该宏检验当前编译器是C++编译器还是C编译器。C++编译器会对变量名、函数名等符号重整,而extern "C"对这种重整的抑制。这样有利于项目的移植
宏#和##
#是转字符串
##是链接
示例:
#define ADD(x, y) x##y
#define TRAN(x) #x
int main(int argc, char *argv[]){
std::cout << "start" << std::endl;
std::cout << ADD(12, 12) << std::endl;
int a = 12;
std::cout << TRAN(a) << std::endl;
return 0;
}
//输出:
> start
> 1212
> a