核心预定义符号
__FILE__
:字符串类型,表示当前源代码文件的名称。__LINE__
:整型,表示当前源代码的行号。__DATE__
:字符串类型,表示源文件被编译的日期,格式为"MMM DD YYYY"
。__TIME__
:字符串类型,表示源文件被编译的时间,格式为"HH:MM:SS"
。__FUNCTION__
:在C99标准中未定义,但许多编译器提供支持,表示当前函数名称的字符串。__STDC__
:整型,如果编译器遵循ANSI C标准,则定义该宏。__STDC_VERSION__
:长整型,表示遵循的C标准的版本。例如,C99标准是199901L
。__func__
:C99标准新增,字符串类型,表示当前函数名称。
编译器特定预定义符号
__VERSION__
:在一些编译器中定义,包含编译器的版本字符串。__clang__
:在Clang编译器中定义,可以用来检测代码是否被Clang编译器编译。__GNUC__
、__GNUC_MINOR__
、__GNUC_PATCHLEVEL__
:在GCC中定义,分别表示GCC的主版本号、次版本号和补丁级别。_MSC_VER
:在Microsoft Visual C++编译器中定义,展开为一个表示编译器版本号的整数。__EXCEPTIONS
:在支持异常的C++环境中定义,如果编译器支持异常处理,则定义此宏。__cplusplus
:在C++代码中定义,表示C++标准的版本,例如,C++11是201103L
。__BORLANDC__
:在Borland C++编译器中定义,表示Borland C++编译器的版本。_WIN32
:在Windows平台上编译时定义,表示代码在Windows环境下编译。__linux__
:在Linux平台上编译时定义,表示代码在Linux环境下编译。
应用示例
预定义宏广泛用于条件编译、环境检测和调试信息的生成。例如,使用__FILE__
和__LINE__
打印错误发生的文件和行号:
fprintf(stderr, "Error occurred at %s:%d\n", __FILE__, __LINE__);
或者,根据不同的操作系统编写特定的代码段:
#ifdef _WIN32// Windows-specific code
#elif defined(__linux__)// Linux-specific code
#endif
注意事项
- 使用预定义宏时,需要了解目标编译器是否支持这些宏。
- 预定义宏提供了编译时环境的快照,它们不会随着程序的运行而改变。
- 在跨平台编程时,应谨慎使用特定编译器的预定义宏,以保持代码的可移植性。