跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C 语言预定义宏
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本条目将详细介绍C语言预处理器中的预定义宏,这些宏由编译器预先定义,无需用户声明即可直接使用。}} == 简介 == '''预定义宏'''是C语言标准规定的一系列由编译器实现的特殊宏,它们在预处理阶段被自动展开,提供编译环境、日期时间等系统级信息。这些宏的名称通常以双下划线开头和结尾(如<code>__FILE__</code>),是调试和跨平台开发的重要工具。 == 标准预定义宏列表 == 以下是C99/C11标准中必须实现的宏: {| class="wikitable" ! 宏名称 !! 描述 !! 示例展开值 |- | <code>__DATE__</code> || 编译日期("Mmm dd yyyy"格式) || "Jun 15 2023" |- | <code>__TIME__</code> || 编译时间("hh:mm:ss"格式) || "14:30:45" |- | <code>__FILE__</code> || 当前源文件名(字符串字面量) || "example.c" |- | <code>__LINE__</code> || 当前行号(整型字面量) || 42 |- | <code>__STDC__</code> || 若编译器符合ANSI C标准则展开为1 || 1 |- | <code>__STDC_VERSION__</code> || C标准版本(如199901L表示C99) || 201112L |} == 详细说明与示例 == === 基础调试宏 === 最常用的调试组合是<code>__FILE__</code>和<code>__LINE__</code>: <syntaxhighlight lang="c"> #include <stdio.h> int main() { printf("Debug: %s line %d\n", __FILE__, __LINE__); return 0; } </syntaxhighlight> 输出示例: <pre> Debug: test.c line 5 </pre> === 编译环境检测 === 通过<code>__STDC__</code>系列宏可检测编译器合规性: <syntaxhighlight lang="c"> #if __STDC_VERSION__ >= 201112L printf("Using C11 or later\n"); #elif __STDC_VERSION__ >= 199901L printf("Using C99\n"); #else printf("Using ANSI C (C89)\n"); #endif </syntaxhighlight> === 特殊平台宏 === 不同编译器会扩展额外的预定义宏(非标准): {| class="wikitable" ! 编译器 !! 示例宏 !! 用途 |- | GCC/Clang || <code>__linux__</code> || Linux平台检测 |- | MSVC || <code>_WIN32</code> || Windows平台检测 |- | 通用 || <code>__cplusplus</code> || C++模式检测 |} == 实际应用案例 == === 调试日志系统 === <syntaxhighlight lang="c"> #define LOG(msg) \ fprintf(stderr, "[%s %s] %s:%d - %s\n", \ __DATE__, __TIME__, __FILE__, __LINE__, msg) int main() { LOG("Memory allocation failed"); return 0; } </syntaxhighlight> 输出示例: <pre> [Jun 15 2023 14:30:45] alloc.c:8 - Memory allocation failed </pre> === 跨平台代码 === <syntaxhighlight lang="c"> #if defined(_WIN32) #include <windows.h> #define SLEEP(ms) Sleep(ms) #elif defined(__unix__) #include <unistd.h> #define SLEEP(ms) usleep(ms * 1000) #endif </syntaxhighlight> == 高级用法 == === 构建版本标识 === 结合多个宏生成唯一版本字符串: <syntaxhighlight lang="c"> #define STRINGIFY(x) #x #define BUILD_VERSION "v1.0-" STRINGIFY(__DATE__) // 展开结果示例:v1.0-Jun_15_2023 </syntaxhighlight> === 条件编译优化 === 使用<code>__GNUC__</code>检测GCC特性: <syntaxhighlight lang="c"> #if __GNUC__ >= 5 // 使用GCC5+的特性 #define likely(x) __builtin_expect(!!(x), 1) #else #define likely(x) (x) #endif </syntaxhighlight> == 注意事项 == * 预定义宏的值在预处理阶段确定,运行时不会改变 * 避免重定义标准预定义宏(如<code>#define __LINE__ 100</code>),这是未定义行为 * 平台特定宏需要查阅编译器文档 == 可视化关系 == <mermaid> graph TD A[预定义宏] --> B[标准宏] A --> C[编译器扩展宏] B --> D[__FILE__] B --> E[__LINE__] B --> F[__DATE__] C --> G[GCC的__linux__] C --> H[MSVC的_WIN32] </mermaid> == 数学表示 == 在条件编译中,宏展开可视为函数: <math> f(x) = \begin{cases} 1 & \text{if } \_\_STDC\_\_ \text{ is defined} \\ 0 & \text{otherwise} \end{cases} </math> {{Warning|预定义宏的展开结果可能因编译器而异,重要场景应进行充分测试。}} [[Category:编程语言]] [[Category:C]] [[Category:C 语言预处理器]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)