欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

#define用法总结

程序员文章站 2024-03-23 11:45:04
...

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