当然,下面我会使用一些具体的例子来说明这些预定义宏的用途。
1. 调试和日志记录
例子1:在断言失败时输出文件名和行号
c复制代码
#include <assert.h> | |
#include <stdio.h> | |
void my_function() { | |
int some_value = 0; | |
assert(some_value != 0 && "Assertion failed in my_function!"); | |
} | |
int main() { | |
my_function(); // 如果断言失败,将输出文件名和行号 | |
return 0; | |
} |
在这个例子中,如果assert
表达式失败,它将输出一个错误消息,并包含__FILE__
和__LINE__
宏,这样你就能知道断言是在哪个文件的哪一行失败的。
2. 条件编译
例子2:根据平台编译不同的代码
c复制代码
#include <stdio.h> | |
int main() { | |
#ifdef __WIN32__ | |
printf("Code is compiled for Windows.\n"); | |
#elif defined(__unix__) | |
printf("Code is compiled for a Unix-like system.\n"); | |
#else | |
printf("Unknown platform.\n"); | |
#endif | |
return 0; | |
} |
在这个例子中,我们根据预定义的宏来判断代码是在哪个平台上编译的,并输出相应的消息。
3. 函数名标识
例子3:在函数中输出函数名
c复制代码
#include <stdio.h> | |
void my_function() { | |
printf("This is function: %s\n", __func__); | |
} | |
int main() { | |
my_function(); // 输出 "This is function: my_function" | |
return 0; | |
} |
在这个例子中,__func__
宏被用来获取当前函数的名称,并在函数内部打印出来。
4. 版本控制
例子4:检查C标准版本
c复制代码
#include <stdio.h> | |
int main() { | |
#if __STDC__ | |
printf("Code is compiled with a C standard.\n"); | |
#if __STDC_VERSION__ >= 199901L | |
printf("Code is compiled with C99 or a later standard.\n"); | |
#else | |
printf("Code is compiled with an earlier C standard.\n"); | |
#endif | |
#else | |
printf("Code is not compiled with a C standard.\n"); | |
#endif | |
return 0; | |
} |
在这个例子中,我们检查__STDC__
宏来确定代码是否按照C标准编译,并进一步检查__STDC_VERSION__
宏来确定是哪个版本的C标准。
请注意,上述宏的确切名称和可用性可能因编译器和平台而异。在编写依赖于这些宏的代码时,最好查阅相关编译器的文档以确认宏的确切名称和用法。