#define const typedef

#define用法

1. 定义简单的常数:定义常量,便于修改

#define N 1000

2. 定义简单的函数:注意多使用括号

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

 

const常量与define宏定义的区别

编译器处理方式不同:

define宏是在预处理阶段展开。const常量是编译运行阶段使用。

类型和安全检查不同:

define宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查。

存储方式不同:

define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。

const常量会在内存中分配(可以是堆中也可以是栈中)。

 

C++的const比C语言#define更好的原因?

首先,它能够明确指定类型,有类型检查功能。

其次,可以使用C++的作用域规则将定义限制在特定的函数或文件中。

第三,可以将const用于更复杂的类型,比如数组和结构。

C语言中也有const,其与C++中const的区别是:一是作用域规则不同;另一个是,在C++中可以用const值来声明数组长度。C编译器不能把const看成一个编译期间的常量,即C编译器不知道它在编译时的值。

===========================================================

对宏定义的使用要非常小心,特别要注意两个问题:

(1)谨慎地将宏定义中的“参数”和整个宏用括弧括起来。如定义最小宏:#define MIN(A,B) ( (A) <= (B) ? (A) : (B) ) ,所以,严格地讲,下述解答:

#define MIN(A,B) (A) <= (B) ? (A) : (B) ////// #define MIN(A,B) (A <= B ? A : B ) 都应判0分;

(2)防止宏的副作用。对MIN(*p++, b)的作用结果是:((*p++) <= (b) ? (*p++) : (*p++)) ,这个表达式会产生副作用,指针p会作三次++自增操作。

 

typedef用法

简化复杂的类型声明

简化复杂的类型声明,或给已有类型起一含义明确的别名;如:

typedef bool (*FuncPointer)(int, double); //声明了一个返回 bool 类型并带有两个(int和double)形参的函数的指针类型FuncPointer

FuncPointer pFunc; //声明了一个FuncPointer类型的函数指针对象pFunc

定义与平台无关的类型

定义与平台无关的类型,屏蔽不同平台的类型差异化;如:

用typedef来定义与平台无关的类型。

比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:

typedef long double REAL;

在不支持 long double 的平台二上,改为:

typedef double REAL;

在连 double 都不支持的平台三上,改为:

typedef float REAL;

也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。

标准库就广泛使用了这个技巧,比如size_t。另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健。

与struct的结合使用

在C++中,struct与class的作用相同,就是默认的访问权限不同,struct默认为public,而class默认为private的。

但是在C语言中,struct的定义和声明要用typedef。如果没有typedef就必须用struct Person person;来声明

 

typedef与#define的区别

执行时间不同

关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。

#define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。

功能有差异

typedef用来定义类型的别名,定义与平台无关的数据类型,与struct的结合使用等。

#define不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

作用域不同

#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。

而typedef有自己的作用域。

参考:http://blog.csdn.net/luoweifu/article/details/41630195

 

posted on 2016-09-03 16:23  已停更  阅读(317)  评论(0编辑  收藏  举报