#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
相关文章推荐
- #define的用法总结
- #define用法总结
- #define用法详解 及#ifndef #define #endif 总结
- C语言的#define用法总结
- C语言中宏定义#define用法总结。
- #define总结-#define用法集锦 (网上资料汇集)
- #define用法总结
- #define用法总结
- C++ #define用法总结
- #define用法总结
- #define用法总结
- #define总结-#define用法集锦
- C语言中的#define用法总结
- 关于typedef的用法总结(以及typedef与#define的用法区别)
- C语言之#define用法总结
- #define总结-#define用法集锦 (网上资料汇集)
- #define用法总结
- C语言之#define用法总结
- C语言中#define用法总结
- #define用法总结