您的位置:首页 > 其它

#define用法总结

2017-10-12 22:10 260 查看

#define定义和使用

宏定义是C语言提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。宏定义和操作符的区别是:宏定义是替换,不做计算,也不做表达式求解。

格式:

#define 标识符 字符串

定义宏:

#define PI 3.141592653
//把圆周率定义为PI这个变量,而PI不能被修改,除非使用#define重新定义


使用宏:

#include <iostream>
using namespace std;
int main()
{
cout<< "半径R=5的圆面积为:"<< PI * 5 * 5 <<endl;
}
//求圆的面积π*R²
//result: 78.539816325


#define优缺点

缺点

(1) 不对变量进行类型检查

此缺点正是const的优点:

【define与const的区别】

define定义的变量是Compile-Time时期的变量,系统在编译时将其全部替换,不会检查变量的类型等属性,不是很安全,可能存在问题没有被发现。正因为其仅仅是编译时期替换,所以其定义的变量,是不会在运行时候分配内存的,不占用内存空间。而const定义的变量是 Run-Time时期的变量,如果类型不匹配,系统在运行时就会发现并提示或报错;const变量在运行时期,也是一种变量,系统会为其分配内存。

(2) 边界效应

未加括号带来的边界效应

如:

#define MUL(a,b) a*b

int x=1,y=2,z=3,w=0;
w = MUL(x+y,z);
//我们希望得到(x+y)*z的结果:9
//但是得到结果是x+y*z=7
//正确的宏定义: #define MUL(a,b) (a)*(b)


再如:

#define INTPT (int*)

INTPT a,b;
//原意为a和b是int型指针,但是变成了in
4000
t* a,b;a是int指针,b为int变量
//应该使用typedef (int *) INTPT; INTPT a,b;


(3) 宏定义展开后源代码冗长

宏定义是为了减少代码的编写和经常使用常量定义,对于程序员来说这个是没有问题,得到的效果也很明显,但是对于代码解析后的文件来说,如果非常极端地使用宏,代码中过多的使用宏定义的函数,那么在编译文件中就会在使用代码出形成一个代码替代,而导致编译后的文件过大,不如使用函数效果好。

优点

使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义。此外,宏定义并不额外分配内存。

相比于函数的调用形式来说,使用宏展开并不占用运行的时间,而是编译的时间,所以相对函数调用(分配内存、保存现场、值传递、返回值等)占用运行时间,宏定义做到了牺牲极小的空间换取运行时间的缩短。

#define的变体

#ifndef定义和使用

#define的变体,即#ifndef,可以防止头头文件的重复引用或重复定义导入。

(1). #ifndef和#define组合,一般用于头文件中,用以实现防止同一个头文件重复导入。实际使用中,即使你的头文件暂时没有被多个文件所引用,为了增加程序可读性、移植性、健壮性等,还是最好都加上。其用法一般为:

// "definehead.h"
#ifndef _DEFINEHEAD_H
#define _DEFINEHEAD_H
// include or define sth.
#endif


在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的;标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线。

这样,以后某个文件引用此头文件,就包含了definehead.h文件,而其他文件如果再引用此头文件的话,编译器那么就会判断出来,已经define了definehead.h,已经有其他文件引用了此文件,so, the complier will not include this header file. 就可以发现解决重复引用头文件的问题了。

#ifdef的定义和使用

#ifdef,可以实现加入自己需要的模块(源文件)

在源文件中加入:

// OtherUse.cpp
#ifdef _DEFINEHEAD_H
#include "definehead.cpp"
#endif


可以实现在源文件中加入definehead.cpp这个文件中的代码。注意不要再头文件中使用这段导入,可能会导致其他导入OtherUse.h的文件导入definehead.cpp,而在源文件中不会存在这样的问题。

几种define定义

简单变量#define定义

#define PI 3.141592653


简单的变量替换。

函数的#define定义

#define MAX(A,B) (A)>(B)?(A):(B)


求两个数中较大的值,因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。

define的多行定义

define 中可以使用多行定义:

#define MAX3(a,b,c) \
printf("MAX Value: ");\
printf("%d",a>b?(a>c?a:c):(b>c?b:c));


每一行都在最后加上一个“\”,除了最后一行。

定义宏、取消宏

//定义宏
#define [MacroName] [MacroValue]
//取消宏
#undef [MacroName]


条件编译

#ifndef _MY_DEBUG
#define ALL_MODE 3
#else
#define ONE_MODE 3
#endif


比较好的应用是大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。

#ifdef WINDOWS
......
......
#endif
#ifdef LINUX
......
......
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: