C++中 #define与const、inline、typedef的区别

来源:互联网 发布:笛子音效软件 编辑:程序博客网 时间:2024/05/23 21:10

#define与const、inline、typedef的区别
   我们在使用C++是肯定多次经意或不经意的使用过#define,在C++的头文件一般都是这样定义的:
#if ! defined  _SAMPLE_H_
#define _SAMPLE_H_
/*other utility sentence */
#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区别:
#define UINT unsigned int
typedef unsigned int UINT;
    #define和前面讲的一样只一个宏,它在编译之前就被替代了,更不会产生新的类型。同样typedef也不会产生新类型,但这两个也是有一定的区别的,看看MSDN中对typedef的解释:
A typedef declaration introduces a name that, within its scope, becomes a synonym for the type given by the decl-specifiers portion of the declaration. In contrast to the class, struct, union, and enum declarations, typedef declarations do not introduce new types — they introduce new names for existing types.
从中应该看出他们有一点区别就是 typedef定义的是一个同义词,这个同一次是有生存范围的(scope)。
#define特有的功能:
    #define还有一些特有的功能,比如本文开头提到的编译开关,这个暂时还没有替代的方法,但是如果你的头文件引用(#include语句)很小心并精心设计的话,在你的头文件中可以不需要这个语句。
原创粉丝点击