C语言预定义宏一览表(附带示例)
C语言中的预定义宏,是由编译器自动定义好的宏,我们可以直接在代码中使用,而不需要提前定义。接下来,让我们了解一下这些预定义宏的用法。
以下是C语言中常用的预定义宏及其含义:
预定义宏 | 含义 |
---|---|
__FILE__ | 当前源文件名 |
__LINE__ | 当前源代码行号 |
__DATE__ | 编译日期 |
__TIME__ | 编译时间 |
__STDC__ | 指示编译器是否符合 ISO C(ANSI C) 标准 |
__STDC_VERSION__ | 详细的 C 标准版本信息 |
__FUNCTION__ | 当前函数名(C99 引入) |
__FILE__ 预定义宏
__FILE__ 宏用于获取当前源文件的名称。它会被替换为一个字符串字面量,包含了正在编译的源文件的名称。这个宏在调试和日志记录中特别有用,可以帮助我们快速定位问题发生的文件。
#include <stdio.h> int main() { printf("This file is: %s\n", __FILE__); return 0; }
输出结果:
This file is: /path/to/your/file.c
__LINE__ 预定义宏
__LINE__ 宏用于获取当前代码行的行号。它会被替换为一个整数常量,表示在源文件中的行号。这个宏通常与 __FILE__ 一起使用,可以精确定位代码的位置,对于调试和错误报告非常有帮助。
#include <stdio.h> int main() { printf("Current line number is: %d\n", __LINE__); return 0; }
输出结果:
Current line number is: 4
__DATE__ 和 __TIME__ 预定义宏
__DATE__ 宏会被替换为一个字符串字面量,表示源文件被编译的日期,格式为 "Mmm dd yyyy",例如 "Jun 14 2023"。这个宏可以用来记录程序的编译时间,有助于版本控制和追踪。
__TIME__ 宏会被替换为一个字符串字面量,表示源文件被编译的时间,格式为 "hh:mm:ss",例如 "23:59:59"。与 __DATE__ 宏结合使用,可以精确记录程序的编译时刻。
#include <stdio.h> int main() { printf("This program was compiled on %s at %s\n", __DATE__, __TIME__); return 0; }
输出结果(注意:实际输出会根据编译时间而变化):
This program was compiled on Jun 14 2023 at 15:30:45
__STDC__ 预定义宏
__STDC__ 宏用于指示编译器是否符合 ISO C 标准。如果编译器符合标准,这个宏的值为 1,否则可能未定义或者值为 0。这个宏可以用来编写在不同标准下都能正确编译的代码。
#include <stdio.h> int main() { #ifdef __STDC__ printf("This compiler conforms to the ISO C standard.\n"); #else printf("This compiler may not conform to the ISO C standard.\n"); #endif return 0; }
__STDC_VERSION__ 预定义宏
__STDC_VERSION__ 宏提供了更详细的 C 标准版本信息。它的值是一个长整型常量,表示支持的 C 标准版本。例如,199901L 表示 C99 标准,201112L 表示 C11 标准,201710L 表示 C17 标准。这个宏可以用来针对不同的 C 标准版本编写特定的代码。
#include <stdio.h> int main() { #ifdef __STDC_VERSION__ printf("C Standard version: %ld\n", __STDC_VERSION__); #else printf("C Standard version information not available.\n"); #endif return 0; }
__FUNCTION__ 预定义宏
__FUNCTION__ 宏返回当前函数的名称。这个宏在 C99 标准中被引入,用于调试和日志记录,可以帮助我们追踪函数调用和执行流程:
void example_function() { printf("Current function: %s\n", __FUNCTION__); } int main() { example_function(); printf("Current function: %s\n", __FUNCTION__); return 0; }
输出结果:
Current function: example_function Current function: main
编译器特有的宏
除了这些标准的预定义宏,许多编译器还提供了特定的预定义宏,用于识别编译器类型、目标平台等信息。例如,GCC 编译器定义了 __GNUC__、__GNUC_MINOR__ 等宏,可以用来检测 GCC 版本。Microsoft Visual C++ 定义了 _MSC_VER 宏,可以用来检测 MSVC 版本。
预定义宏的一个重要应用是条件编译。通过使用 #ifdef、#ifndef、#if defined() 等预处理指令,我们可以根据不同的宏定义来选择性地编译代码,这在跨平台开发、调试模式切换等场景中非常有用。请看下面的例子:
#include <stdio.h> int main() { #ifdef _WIN32 printf("This code is compiled for Windows.\n"); #elif defined(__linux__) printf("This code is compiled for Linux.\n"); #elif defined(__APPLE__) printf("This code is compiled for macOS.\n"); #else printf("Unknown platform.\n"); #endif return 0; }
总结
总的来说,C语言的预定义宏主要为程序员提供了编译相关的信息,比如行号、源文件名称等。
在使用预定义宏时,需要注意以下几点:
- 预定义宏的值可能会因编译器和编译选项的不同而变化,使用时要注意兼容性问题。
- 过度依赖预定义宏可能会降低代码的可移植性,应当谨慎使用。
- 某些预定义宏(如 __TIME__)的值在每次编译时都会改变,这可能会影响增量编译的效率。