#define MYCODE __FILE__,__LINE__,__FUNCTION__
#define MYCODE2 mycall(__FILE__,__LINE__,__FUNCTION__);
void mycall(char* file=__FILE__,int line=__LINE__,const char* function=__FUNCTION__)
{
printf("%s:%d %s\n",file,line,function);
printf("%s:%d %s\n",__FILE__,__LINE__,__FUNCTION__);
}
int main()
{
mycall(__FILE__,__LINE__,__FUNCTION__);
mycall();
mycall(MYCODE);
MYCODE2
return 0;
}
打印结果:
/root/code/testexe/src/testexe.cpp:380 main
/root/code/testexe/src/testexe.cpp:375 mycall
/root/code/testexe/src/testexe.cpp:372
/root/code/testexe/src/testexe.cpp:375 mycall
/root/code/testexe/src/testexe.cpp:382 main
/root/code/testexe/src/testexe.cpp:375 mycall
/root/code/testexe/src/testexe.cpp:383 main
/root/code/testexe/src/testexe.cpp:375 mycall
可见,作为默认参数,只是函数声明的文件和行数,没有函数名。
作为宏定义的话,不是宏定义申明的位置,而是实际调用的位置。
ANSI标准说明了五个预定义的宏名。它们是:
__LINE__
__FILE__
__DATE__
__TIME__
__STDC__
C++中还定义了 __cplusplus
如果编译器不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序也许还提供其它预定义的宏名。
__LINE__ 及 __FILE__ 宏指示,#line指令可以改变它的值,简单的讲,编译时,它们包含程序的当前行数和文件名。
__DATE__ 宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。
__TIME__ 宏指令包含程序编译的时间。时间用字符串表示,其形式为: 分:秒
__STDC__ 宏指令的意义是编译时定义的。一般来讲,如果__STDC__已经定义,编译器将仅接受不包含任何非标准扩展的标准C/C++代码。如果实现是标准的,则宏__STDC__含有十进制常量1。如果它含有任何其它数,则实现是非标准的。
__cplusplus 与标准c++一致的编译器把它定义为一个包含至少6为的数值。与标准c++不一致的编译器将使用具有5位或更少的数值。