C语言宏定义总结

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

gcc 报错图片
可以看到,在第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;
}

总结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值