ANSI C标准中有几个标准预定义宏:__FILE__ __DATE__ __TIME___ __LINE__ 等
__LINE__:在源代码中插入当前源代码行号;
__FILE__:在源文件中插入当前源文件名;
__DATE__:在源文件中插入当前的编译日期
__TIME__:在源文件中插入当前编译时间;
__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
__cplusplus:当编写C++程序时该标识符被定义。
在调试程序时或编译时,__LINE__比较有用,可以用来打印逻辑错误的行号
switch(x) { case 1: ....; break; case 2: .....; break; default: printf("logic erro line number%d!/n",__LINE__); break; }
又如利用__DATE__和__TIME__可以插入编译时间。
代码:
void print_version_info(void) { printf("Date Compiled:%s/n",__DATE__); printf("TimeCompiled:%s/n",__TIME__); }
输出格式为:mm dd yy 和 hh:mm:ss
__DATE__,__FILE__,__LINE__,__TIME__,__FUNCTION__ C标准中指定了一些预定义的宏,对于编程经常会用到。下面这个表中就是一些常常用到的预定义宏。
__DATE_ %s_
进行预处理的日期(“Mmm dd yyyy”形式的字符串文字)
__FILE__ %s
代表当前源代码文件名的字符串文字
__LINE__ %d
代表当前源代码中的行号的整数常量
__TIME__ %s
源文件编译时间,格式微“hh:mm:ss”
__FUNCTION__(__func__) %s
在Visual Studio 2013中,默认情况下,此特性是激活的,但不能与/EP和/P编译选项同时使用。请注意在IDE环境中,不能识别__func__ ,而要用__FUNCTION__ 代替
__PRETTY_FUNCTION__ %s
当前所在函数名,包括返回类型和参数类型。
例如:
printf("__PRETTY_FUNCTION__:%s/n", __PRETTY_FUNCTION__);
输出:__PRETTY_FUNCTION__:int main(int, char**)
作用:对于__FILE__,__LINE__,__func__这样的宏,在调试程序时是很有用的,因为你可以很容易的知道程序运行到了哪个文件的那一行,是哪个函数。下面一个例子是打印上面这些预定义的宏的。
#include <stdio.h> #include <stdlib.h> void fun() { printf("This function is %s\n", __FUNCTION__); printf("The file is %s.\n", __FILE__); printf("This is line %d.\n", __LINE__); } int main() { printf("The file is %s.\n", __FILE__); printf("The date is %s.\n", __DATE__); printf("The time is %s.\n", __TIME__); printf("This is line %d.\n", __LINE__); printf("This function is %s.\n", __FUNCTION__); fun(); system("pause"); return 0; }