__FILE__,__LINE__
在调试C/C++代码的时候,我们最想知道的,当然是程序当前走到了哪个文件的第几行了,这里有两个宏:__FILE__和__LINE__,返回的是当前文件的路径,和当前行。
这里测试代码如下:
- #include <cstdio>
- int main()
- {
- printf("%s : %d",__FILE__,__LINE__);
- printf("\n");
- return 0;
- }
Windows下运行结果为:
Linux系统运行结果如下:
可以看到,在Windows下,__FILE__返回的是完整路径,而在Linux下使用g++编译,返回的只是文件名。
这个是从C99开始支持的可变参数宏,以前在C语言中,只支持函数的可变参数
比如我们最常见的printf函数:
- void printf(const char* format, …);
这里的省略号…,就是可变参数。
而__VA_ARGS__这个宏就是实现了宏的可变参数:
- #define debug(…) printf(__VA_ARGS__)
测试代码如下:
- #include <cstdio>
- #define DEBUG(...) printf(__VA_ARGS__)
- int main()
- {
- DEBUG("duanxx %d\n",123);
- return 0;
- }
Windows下的运行结果:
Linux下的运行结果:
一行调试宏
有了上面的说明,就可以写出下面的调试宏:
- #define DEBUG(fmt, ...) \
- fprintf(stdout, "%s:%d Duanxx Debug " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)
测试代码:
- #include <cstdio>
- #define DEBUG(fmt, ...) \
- fprintf(stdout, "%s:%d Duanxx Debug " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)
- int main()
- {
- DEBUG("duanxx %d\n",123);
- return 0;
- }
Windows下结果:
Linux下的结果: