C语言中define的用法详解

宏——无非就是定义一个替换的量,好比#define PI 3.1415926,这样的功能,再深一点就是写一个类似函数的定义,好比#define MAX(a,b) ((a) > (b) ? (a) : (b))这样的功能。下面讲解一下具体用法:

一、简单的define定义

#define MAXTIME 1000

一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写

if(i<MAXTIME){.........}

编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。
这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。

二、define的“函数定义”

define可以像函数那样接受一些参数,如下

#define max(x,y) (x)>(y)?(x):(y);

这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。
但是这样做的话存在隐患,例子如下:

#define Add(a,b) a+b;

在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a+b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了:

c*a + b*d

另外举一个例子:

#define pin (int*);
pin a,b;

本意是a和b都是int型指针,但是实际上变成int* a,b;
a是int型指针,而b是int型变量。
这是应该使用typedef来代替define,这样a和b就都是int型指针了。
所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号

三、宏的单行定义(少见用法)

#define A(x) T_##x
#define B(x) #@x
#define C(x) #x

我们假设:x=1,则有:
A(1)------〉T_1
B(1)------〉‘1’
C(1)------〉“1”

四、define的多行定义

#define可以进行多行定义,这是一个非常经典而且在设备驱动代码中经常要用到的一个方法,格式如下:

#define MACRO(arg1,arg2) do {  \
stmt1; \
stmt2; \
}while(0)

TIP:在每一行的末尾要加上\,切记!
在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。
在这里插入图片描述

五、定义宏和取消宏定义的方法

定义一个宏使用#define,取消一个宏定义使用#undef

//定义宏
#define (MacroName) (MacroValue)
//取消宏
#undef (MacroName)

六、使用宏进行条件编译

格式如下:#ifdef … (#else) … #endif

#ifdef HELLO
#define WORLD 1
#else
#define WORLD 0
#endi

七、用define来处理头文件被头文件或者源文件包含的情况

由于头文件包含可以嵌套,那么c文件有可能包含多次同一个头文件,就会出现重复定义的问题的,那么可以就通过条件编译开关来避免重复包含,如下:

 #ifndef _HELLO_H_
 #define _HELLO_H_
 ...
 //文件内容
 ...
 #endif

参考资料:
《C Primer Plus(第六版)中文版》
《C和指针》
网上总结的文档,因有太多类似的,故不给出具体链接!

  • 18
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值