目录
一.预处理
编译一个C语言程序的第一步骤就是预处理阶段,这一阶段就是宏发挥作用的阶段。C预处理器在源代码编译之前对其进行一些文本性质的操作,主要任务包括删除注释、插入被#include进来的文件内容、定义和替换由#define 定义的符号以及确定代码部分内容是否根据条件编译(#if )来进行编译。”文本性质”的操作,就是指一段文本替换成另外一段文本,而不考虑其中任何的语义内容。宏仅仅是在C预处理阶段的一种文本替换工具,编译完之后对二进制代码不可见
二.宏定义用法
①宏常量
我们最常使用到的#define的用法就是用#define来定义一个符号常量,而要修改时,只需修改#define这条语句就行了,不必每处代码都修改。
#include"stdio.h"
#define PI 3.14
#define STR "圆周率约等于"
int main()
{
printf("%s %f",STR,PI); //预处理时会被替换为 printf("%s %f","圆周率约等于",3.14);
return 0;
}
②宏语句
我们还可以用宏定义一条或多条语句。
#include"stdio.h"
#define Print printf("hello world!")
int main()
{
Print; //预处理时会被替换为 printf("hello world!");
return 0;
}
③宏函数
我还可以用宏来定义函数,因为宏定义也可以带参数。
#include"stdio.h"
#define Print(str) printf("%s",str)
int main()
{
Print("这是一个只有一条语句的宏函数!");
//预处理时会被替换为 printf("%s","这是一个只有一条语句的宏函数!")
return 0;
}
④其它
1.#undef 是用来撤销宏定义的,用法如下:
#define PI 3.141592654
…
// code
#undef PI
//下面开始 PI 就失效了
2.使用ifndef防止头文件被重复包含和编译
这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译。 C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分。
#ifndef x //先测试x是否被宏定义过
#define x //如果没有宏定义下面就宏定义x并编译下面的语句
...
...
...
#endif //如果已经定义了则编译#endif后面的语句
条件指示符#ifndef检查预编译常量在前面是否已经被宏定义。如果在前面没有被宏定义,则条件指示符的值为真,于是从#ifndef到#endif之间的所有语句都被包含进来进行编译处理。相反,如果#ifndef指示符的值为假,则它与#endif指示符之间的行将被忽略。条件指示符#ifndef 的最主要目的是防止头文件的重复包含和编译。
千万不要忽略了头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都incl