使用__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__)"):字符串!")

成功了.

posted @ 2009-05-18 17:33  孤竹君  阅读(568)  评论(0编辑  收藏  举报