特殊宏
程序员文章站
2022-05-05 09:03:57
...
__cplusplus
- 当C++和C差别足够大时,编译器为了区分C++和C,会自主判断是否携带该宏,编译器认为是C++语言时会携带该宏,认为是C语言时则不会携带。
- 在C和C++混合开发时为了兼容C,我们也会根据该宏做相应处理。
编译器判断测试
- 测试命令与结果:
gcc test.c //编译后不带 __cplusplus 宏
gcc test.cpp //编译后带 __cplusplus 宏
gcc test.C //编译后带 __cplusplus 宏
g++ test.c //编译后带 __cplusplus 宏
g++ test.cpp //编译后带 __cplusplus 宏
g++ test.C //编译后带 __cplusplus 宏
- 使用g++编译,由于c++兼容c,不管是编译.c或.cpp,都会带 __cplusplus 宏,
- 使用gcc编译,除非是.c,其它后缀都会带 __cplusplus 宏
混合开发兼容例子
#ifdef __cplusplus
std::cout << "using C++" << std::endl;
#else
printf("using C\n");
#endif
__FILE__和__LINE__
- 在代码中可以通过__FILE__宏获取代码文件名和 __LINE__宏获取当前代码行号,例如:
printf("Current File %s: line %d\n", __FILE__, __LINE__);
小问题
- 使用__FILE__ 宏来调试代码时,有时候打印出来的路径并不是自己想要的,有时候会打印全路径,有时只会打印单个文件名,如果想要打印相对于project路径的相对路径,需要注意。
- 打印出来的__LINE__值和实际代码行不匹配。
原理
- __FILE__宏是在编译时确定的, 不同编译命令打印结果也是不同的,例如:
gcc -c test.c
打印结果: __FILE__: test.c
gcc -c /root/test.c
打印结果: __FILE__: /root/test.c
- 打印出来的__LINE__值和实际代码行不匹配是因为__LINE__是预处理器替换后的值,因此如果前面的代码有其它宏需要展开,展开后__LINE__就和实际的值不匹配了。
手动修改
- 可以手动修改这两个宏的值来解决一些问题,例如:去掉文件名的完整路径
#line 1 "Filename.c"
- 也可以单独修改__LINE__宏的值,例如:
#line 100
上一篇: PHP中十进制 和十六进制的转换问题
推荐阅读