__FILE__
C/C++中的__FILE__用于指示本行语句所在源文件的文件名,举例如下:
#include <iostream>
using namespace std;
int main()
{
cout << __FILE__ << endl;
return EXIT_SUCCESS;
}
使用g++编译运行得到的输出为:test.cpp
__LINE__
__LINE__用以指示本行语句在源文件中的位置信息,举例如下:
#include <iostream>
using namespace std;
int main()
{
cout << __LINE__ << " ";
cout << __LINE__ << " ";
cout << __LINE__ << endl;
return EXIT_SUCCESS;
}
其编译运行得到的输出结果为:6 7 8
还可以通过语句#line来重新设定__LINE__的值,举例如下:
#include <iostream>
using namespace std;
#line 200
int main()
{
cout << __LINE__ << " ";
cout << __LINE__ << " ";
cout << __LINE__ << endl;
return EXIT_SUCCESS;
}
其中#line 200表示下一行行号为200,因此编译运行得到的结果为:202 203 204
__DATE__ & __TIME__
__DATE__用于指示转换的日历时期,是格式为Mmm dd yyyy的字符串常量,其中Mmm是由asctime获取到的。
__TIME__用于指示转换的时间,是格式为hh:mm:ss的字符串常量,也是由asctime获取到的。举例如下:
#include <iostream>
using namespace std;
int main()
{
cout << __DATE__ << “\t”;
cout << __TIME__ << endl;
return EXIT_SUCCESS;
}
其编译运行得到的结果为:Sep 14 2019 10:17:27
__FUUNCTION__ & __func__
另外gcc/g++还支持__FUNCTION__和__func__,用于指示当前语句所在的函数,举例如下:
#include <iostream>
using namespace std;
void func()
{
cout << __FUNCTION__ << endl;
}
int main()
{
cout << __func__ << endl;
func();
return EXIT_SUCCESS;
}
其编译运行得到的结果为:
main
func
__cplusplus & __STDC__
此外,在项目源码中还经常能看见__cplusplus宏,它主要用于定义是否存在C++编译器,而__STDC__使得编译器按照ansic标准来编译C程序。举例如下:
#include <stdio.h>
int main()
{
#ifdef __cplusplus
printf("C++ ");
#endif
#ifdef __STDC__
printf("C\n");
#endif
return 0;
}
源文件test.c使用gcc的编译运行结果为:C,而将文件后缀改为.cpp并使用g++进行编译,运行后得到的输出结果为C++ C