#if ! defined
#define _SAMPLE_H_
#endif //defined _SAMPLE_H_
#define公用有很多,其在C++中也有不可代替的位置,然而在C++中实现同样的功能可能有多个方法,本文中就谈谈C++中的const、inline、typedef在功用上和#define重叠的部分,并说说他们实现同样的功能的内在区别(声明我的看法不一定很全面,更不权威,只是抛砖引玉让看到我这个文章的朋友和我一起思考这个问题)。
#define PI 3.1415926535897932384626
const long double PI=3.1415926535897932384626;
这个方法很有效,如果要定义常量建议用const。还有一点要提醒一下就是定义字符串常量应该用一下的语句:
const char* const myBlog
注意这儿使用了两个const 是限制char*的,表示字符串的值不能改变,后一个const是约束myBlog的,表示这个标识符的值不能改变。在VC++中可以简写成:
LPCTSTR const myBlog
#define与inline区别:
#define
这个语句已经考虑了a,b可能不是单个标识符或者常量的情况,在定义中用"()"将a,b包裹起来,但这样这个宏定义依然令人头疼。比如你调用
max(++a,++b)时还是会让你比较费解,如下面的例子:
输出:a:6 b:4 c:4
a被加了一次,b只被减了两次,而c却被赋为一个比较小的值4。这个max的一个比较满意的代替方案如下:
template<class
inline
{
}
这样既有同样的效果但没有副作用。在这儿有一点要指出的是不用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。