一、宏定义
宏可以理解为替换,替换过程不会进行语法检查,语法检查在编译时进行。
1.不带参数的宏定义:
宏定义又称为宏代换、宏替换,简称“宏”。实质为直接替换,宏名一般为大写。
例:
#defined PI 3.1415
2.带参数的宏:
#define 宏名(参数表) 文本
例如:#define S(a,b) a*b
需要注意的是:如果宏替换运算式或者函数一般要加上()
错误使用如:
#defined test 5+3
printf("5倍test = %d", test * 5);
实则计算的是:5+3*5
3.条件编译
#ifdef
#else
#endif
顾名思义,更急条件判断是否编译,一般方便调试预处理。
4.预定义宏
一般为系统定义宏,用户一般不自己定义,由两根下划线和名字首尾组合,前后都是两根下划线。
如:
__FONCTION__ //函数名
__LINE__ //行号
运行结果
二、包含类预处理
形如 #include
后接头文件,实质是把头文件的内容展开编译。
三、#的其他使用
“#“ 字符串化
”##“ 连接符
例:
#include <stdio.h>
#define ABC(x) #x // #字符串化 “x”
#define DAY(x) day##x //##连接符号
int main()
{
int day1 = 10;
int day2 = 20;
printf(ABC(ab\n) );
/*
printf("the day is %d\n", day1 ); 输出10
*/
printf("the day is %d\n",DAY(1) );
return 0;
}
四、GCC预处理命令
gcc -E hello.c -o hello.i
编译成.i,把需要预处理的代码替换过来。