现在的位置: 首页 > 综合 > 正文

define与const、inline、typedef的区别

2013年10月17日 ⁄ 综合 ⁄ 共 2082字 ⁄ 字号 评论关闭
#define与const、inline、typedef的区别
   我们在使用C++是肯定多次经意或不经意的使用过#define,在C++的头文件一般都是这样定义的:
#if ! defined  _SAMPLE_H_
#define _SAMPLE_H_

#endif //defined _SAMPLE_H_
#define公用有很多,其在C++中也有不可代替的位置,然而在C++中实现同样的功能可能有多个方法,本文中就谈谈C++中的const、inline、typedef在功用上和#define重叠的部分,并说说他们实现同样的功能的内在区别(声明我的看法不一定很全面,更不权威,只是抛砖引玉让看到我这个文章的朋友和我一起思考这个问题)。

#define与const区别:
     用例子来说明这个问题:
     #define PI 3.1415926535897932384626
    C++编译器在预编译(precompiled)时就用3.14...代替了宏PI,所以后面的编译根本就看不到PI这个标识符,于是PI不会在标识符列表中出现。如果涉及到这个常量的代码在编译时报错,就会很令人费解,因为报错信息提示的是3.14...,而不是PI。如果PI不是在你自己定义的,你就会迷惑,甚至会花时间跟踪下去。解决这个问题的方案很简单,不用预处理宏,定义一个常量如下:
const long double PI=3.1415926535897932384626;
这个方法很有效,如果要定义常量建议用const。还有一点要提醒一下就是定义字符串常量应该用一下的语句:
const char* const myBlog  =  "codefan.spaces.live.com"; 
注意这儿使用了两个const 是限制char*的,表示字符串的值不能改变,后一个const是约束myBlog的,表示这个标识符的值不能改变。在VC++中可以简写成:
LPCTSTR const myBlog  =  "codefan.spaces.live.com"; 
 
#define与inline区别
    先举个例子:
#define  max(a,b)  ((a)>(b)?(a):(b))
这个语句已经考虑了a,b可能不是单个标识符或者常量的情况,在定义中用"()"将a,b包裹起来,但这样这个宏定义依然令人头疼。比如你调用
max(++a,++b)时还是会让你比较费解,如下面的例子:
   int a=5,b=6;
   int c = max(a++,--b);
   printf("a:%d b:%d c:%d\n",a,b,c);
输出:a:6 b:4 c:4
a被加了一次,b只被减了两次,而c却被赋为一个比较小的值4。这个max的一个比较满意的代替方案如下:
template<class  T> 
inline  const T& max(const T& a,const T& b) 
{
    return  a>b?a:b;
}
这样既有同样的效果但没有副作用。在这儿有一点要指出的是不用inline这个编译指示(specifier instructs)也能达到同羊的效果。那加这个inline有什么用呢?inline告诉编译器在调用这个函数的地方用代码替换的方式来代替函数调用,这样做的目的只有一个提高性能。一般于国函数功能很简单,函数调用的代价占函数本身运算的代价的很大的比例是建议用inline编译指示。

#define与typedef的区别

      从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在C中是为了定义常量,到了C++,const、enum、inline的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与typedef两者到底该用哪个好,如#define INT int这样的语句,用typedef一样可以完成,用哪个好呢?我主张用typedef,因为在早期的许多C编译器中这条语句是非法的,只是现今的编译器又做了扩充。为了尽可能地兼容,一般都遵循#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗长的类型的别名。

宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。请看上面第一大点代码的第三行:

typedef    (int*)      pINT;

以及下面这行:

#define    pINT2    int*

效果相同?实则不同!实践中见差别:pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a, b;

表示定义了一个整型指针变量a和整型变量b。

#define特有的功能:
    #define还有一些特有的功能,比如本文开头提到的编译开关,这个暂时还没有替代的方法,但是如果你的头文件引用(#include语句)很小心并精心设计的话,在你的头文件中可以不需要这个语句。

抱歉!评论已关闭.