首页 > 编程笔记 > C语言笔记(精华版)

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语言的预定义宏主要为程序员提供了编译相关的信息,比如行号、源文件名称等。
 

在使用预定义宏时,需要注意以下几点:

相关文章