#define用法总结

来源:互联网 发布:d3.js 人脉关系图实例 编辑:程序博客网 时间:2024/06/06 07:12

#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*bint 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型指针,但是变成了int* 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

原创粉丝点击