C[6] 预处理器
C[6] 预处理器
预处理器指编译器在实际编译之前完成所需的预处理。C 预处理器(C Preprocessor)简写CPP。它不是编译器的组成部分,是编译过程中一个单独的步骤(可以理解为文本替换工具)。
1、预处理器指令(以(#)号开头。)
- #define //定义宏
- #include //包含一个源代码文件
- #undef //取消已定义的宏
- #ifdef //如果宏已经定义,则返回真
- #ifndef //如果宏没有定义,则返回真
- #if //如果给定条件为真,则编译下面代码
- #else //#if 的替代方案
- #elif //如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
- #endif //结束一个 #if……#else 条件编译块
- #error //当遇到标准错误时,输出错误消息
- #pragma //使用标准化方法,向编译器发布特殊的命令到编译器中
示例:
1 2 3 4 5 6 7 8 9 | #define MAX_LENGTH 10 //定义常量 把所有的 MAX_LENGTH 的值替换为 10 #include <stdio.h> // 从系统库中获取 stdio.h,并添加文本到当前的源文件中 #include "myTest.h" // 从本地目录中获取 myTest.h,并添加内容到当前的源文件中。 #undef FILE_SIZE //取消已定义的 FILE_SIZE 值 #define FILE_SIZE 20 //重新定义FILE_SIZE的值为20 //当 MESSAGE 未定义时,定义 MESSAGE的值。 #ifndef MESSAGE #define MESSAGE "Hello TaoRoy!" #endif |
2、预处理器运算符
2.1 连接或延续 运算符(\) 和 字符串常量化运算符(#)
1 2 3 4 5 6 7 8 9 | #include <stdio.h> #define PrintMessage(a, b) \ //宏通常写在单行上,太长,则使用“\”运算符连接 printf (#a#b ": i am fine!\n" ) //“#”把一个宏的参数转换为字符串常量. 结果:TaoRoy:i am fine! int main( void ) { PrintMessage(Tao,Roy); return 0; } |
2.2 标记粘贴运算符(##)
1 2 3 4 5 6 7 8 9 | #include <stdio.h> #define Test(a) printf ("Tao" #a " = %d", Tao##a) //(##)合并两个参数(Tao 和 a) int main( void ) { int Tao520 = 1314; Test(520); //输出:Tao520 = 1314 return 0; } |
2.3 defined() 运算符
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> #if !defined (MESSAGE) //如果没有定义 MESSAGE 这个宏的值,则定义 #define MESSAGE "Hello TaoRoy!" #endif int main( void ) { printf ( "Output: %s\n" , MESSAGE); //输出:Output:Hello TaoRoy! return 0; } |
3、宏的参数化( #define )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> /* int XiangJia(int x) { return x + x; } */ #define XiangJia(x) ((x) + (x)) //模拟函数 XiangJia #define Max(x,y) ((x) > (y) ? (x) : (y)) //注意:参数列表是括在圆括号内,且必须紧跟在宏名称的后边。宏名称和左圆括号之间不允许有空格。 int main( void ) { printf ( "1相加的值: %d\n" , XiangJia(1)); //输出:1相加的值:2 printf ( "1和2最大值是: %d\n" , Max(1, 2)); //输出:1和2最大值是:2 return 0; } |
4、其他预定义的宏(可以使用,但是不能直接修改)
- __DATE__ //当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。
- __TIME__ //当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。
- __FILE__ //这会包含当前文件名,一个字符串常量。
- __LINE__ //这会包含当前行号,一个十进制常量。
- __STDC__ //当编译器以 ANSI 标准编译时,则定义为 1。
示例:
1 2 3 4 5 6 7 8 9 | #include <stdio.h> main() { printf ( "Date :%s\n" , __DATE__ ); printf ( "Time :%s\n" , __TIME__ ); printf ( "Line :%d\n" , __LINE__ ); printf ( "ANSI :%d\n" , __STDC__ ); printf ( "File :%s\n" , __FILE__ ); } |
创建时间:2021.11.04 更新时间:
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报