C[6] 预处理器
C[6] 预处理器
预处理器指编译器在实际编译之前完成所需的预处理。C 预处理器(C Preprocessor)简写CPP。它不是编译器的组成部分,是编译过程中一个单独的步骤(可以理解为文本替换工具)。
1、预处理器指令(以(#)号开头。)
- #define //定义宏
- #include //包含一个源代码文件
- #undef //取消已定义的宏
- #ifdef //如果宏已经定义,则返回真
- #ifndef //如果宏没有定义,则返回真
- #if //如果给定条件为真,则编译下面代码
- #else //#if 的替代方案
- #elif //如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
- #endif //结束一个 #if……#else 条件编译块
- #error //当遇到标准错误时,输出错误消息
- #pragma //使用标准化方法,向编译器发布特殊的命令到编译器中
示例:
#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 连接或延续 运算符(\) 和 字符串常量化运算符(#)
#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 标记粘贴运算符(##)
#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() 运算符
#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 )
#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。
示例:
#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 希望内容对你有所帮助,谢谢!