使用__FILE__和__LINE__
__FILE__和__LINE__对于我们调试程序非常有用,__FILE__定义为字符串表示,__LINE__定义为数字表示,编写一函数封装一下,用%s和%d格式化为字符串是相当地简单,
但是如果定义一个宏来表示就有点麻烦了.借鉴《Windows核心编程》里的例子,先来一实验:
#pragma message(__FILE__"("#__LINE__"):字符串!")
可惜编译不过,编译器不接受"#"符号的这种用法,该符号貌似只能如下使用:
#define STR(x) #x
既然如此,那就接受吧,再实验一下:
#pragma message(__FILE__"("STR(__LINE__)"):字符串!")
编译通过了,但是输出时却直接输出的__LINE__符号,根本没转换成行号。原来STR(__LINE__)展开后为:#__LINE__,由于遇到了#号,则宏参数不再进行展开操作.
应对STR宏的再次包装: #define TOSTRING(x) STR(x)
这样TOSTRING(__LINE__)展开后为:STR(__LINE__),由于宏参数__LINE__也是个宏,因此继续对宏参数进行展开操作,故将__LINE__展开为数字形式。
进行最后的实验:
#pragma message(__FILE__"("TOSTRING(__LINE__)"):字符串!")
成功了.