标签:define
首先,大家要明白一个道理。#define是什么,有什么作用。很简单,大家都知道#define实现宏定义,如下代码:
#define Flag 10
以后Flag的地方,预处理器都用10来代替,试想一下,如果你的函数中不小心定义了一个Flag,而你的用意只是一个局部变量,那么程序会出现什么问题
#define Flag 10
#include<iostream>
using namespace std;
void Fun()
{
int Flag = 15;//编译不通过
cout << Flag << endl;
}
int main()
{
cout << Flag << endl;
Fun();
return 0;
}
上面的例子还不算很严重的说明#define造成的问题,我们知道,#define会在预编译期间实现字符替换,如作者所说,如果有一个错误信息提到10而不是Flag,此时的你对于这个10来自于哪里估计会毫无头绪。但是,如果用
const int Flag = 10;
这条语句,我们就可以避免上述问题的出现。
至于作者提出的有关
class GamePlayer {
private:
static const int NUM_TURNS = 5; // constant eclaration
int scores[NUM_TURNS]; // use of constant
...
};
const int GamePlayer::NUM_TURNS; //必须在类的实现代码文件中定义类的静态成员:
必须在类的实现代码文件中定义类的静态成员这句话,对于编译器vs2013来说是错误的,就算在源文件中没有onst int GamePlayer::NUM_TURNS;
这句话,也能进行取该常量的地址。
对于enum的使用,当编译器不允许static成员变量在in class初始化的情况下,可以使用the enum hack来补偿,
代码如下:
class GamePlayer {
private:
enum { NUM_TURNS = 5 } //
int scores[NUM_TURNS];//
};
并且NUM_TURNS = 5这句话类似于宏定义,此时它是一个常量,不能取地址操作。
下面说宏的另一个缺点:
#define max(a,b) ((a) > (b) ? (a) : (b))
当调用语句
int a = 5, b = 0;
max(++a, b);// a 的值增加了2次
max(++a, b+10); // a 的值只增加了1次
我们可以看到宏定义容易使程序出现非预期结果,稍有不慎,就会让程序出错。
解决办法可以定义下面的template模板,实现同样的功能,不过,前提是a和b对象满足a>b运算符。
template<class T>
inline const T& max(const T& a, const T& b)
{
return a > b ? a : b;
}
标签:define
原文地址:http://blog.csdn.net/u011058765/article/details/46560199