linux C语言开发系列
第一章 宏定义深入探讨前言
宏定义是C语言中比较重要的一个部分,可以完成很多重要的功能,下面就对目前应用到的地方进行一个总结。一、宏定义什么?
C语言中,可以用 #define 定义一个标识符来表示一个常量。
其特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。
预编译又叫预处理。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。
二、宏定义初探
1.使用宏定义
用 #define 定义标识符的一般形式为:
#define 标识符 常量 //注意, 最后没有分号
我们可以用gcc来简单测试一下。
首先新建一个测试文件 test.c
#include <stdio.h>
/*--------------------------------------宏定义-------------------------------------------*/
#define PI 3.1415926
/*--------------------------------------------------------------------------------------*/
int main()
{
printf("PI = %.04f\n",PI);
return 0;
}
然后在终端输入
gcc -E test.c -o test.i
gcc -E参数是预编译指令,可以将源文件中的宏定义全部展开,-O 是指定生成目标文件名称。
打开预编译出来的test.i 文件,我们可以看到
int main()
{
printf("PI = %.04f\n",3.1415926);
return 0;
}
”PI“被替换成了3.1415926
2.取消宏定义
用 #undef 定义标识符的一般形式为:
#undef 标识符 //注意, 最后没有分号
这个语句用来取消对标识符的定义。
我们可以测试一下,在test.c文件中增加语句
#include <stdio.h>
/*------------------------------宏定义---------------------------------------*/
#define PI 3.1415926
/*---------------------------------------------------------------------------*/
int main()
{
printf("PI = %.04f\n",PI);
#undef PI
printf("PI = %.04f\n",PI);
return 0;
}
然后在终端输入
gcc -E test.c -o test.i
打开预编译出来的test.i 文件,我们可以看到
int main()
{
printf("PI = %.04f\n",3.1415926);
printf("PI = %.04f\n",PI);
return 0;
}
第一个”PI“被替换成了3.1415926
第二个”PI“没有被替换,因为关于PI的宏定义被取消了
我们编译一下,生成目标文件看一下
在终端输入
gcc test.c -o hello
可以看到,在第18行处报错,‘PI’未定义
三、#符和##连接符的使用
1.字符串化操作
在C语言的宏定义中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量 通过替换后在其左右各加上一个双引号。
用 # 字符串化操作的一般形式为:
#define printf(EXP) printf(#EXP)
我们还是在test.c文件中测试一下
#include <stdio.h>
/*------------------------------宏定义--------------------------------------*/
#define LOG(EXP) printf(#EXP)
/*--------------------------------------------------------------------------*/
int main()
{
int divider = 0;
LOG(divider);
return 0;
}
我们还是预编译一下,在终端中输入
gcc -E test.c -o test.i
打开预编译出来的test.i 文件,我们可以看到
int main()
{
int divider = 0;
printf("divider");
return 0;
}