你可能不知道得define

#define G_VARIABLE 26.5
记号G_VARIABLE可能不会被编译器看到,在进行预处理的时候,G_VARIABLE已经被替换成26.5,于是G_VARIABLE并未进入符号表,此时运行次变量出现错误的提示可能只会提到26.5,若此时G_VARIABLE定义在一个非你写的头文件里,此时追踪他可能浪费一些时间,原因是你使用的名称未进入symbol table。解决此类方法下:

利用const代替defind,const double g_variable 26.5
g_variable 肯定可以进入符号表,盲目用G_VARIABLE替换26.5可能出现object code 出现多分26.5,改用const ,g_variable在内存中只保留一份。

class Gameplay

private:
static const int Num=5; //Num被封装在Class中,且在静态存储区只保留一分内存
int scoure[Num];
}
无法define创建一个class专属常亮,defines并不重视scope,一旦被定义,在其后的编译过程中都有效除非#undef。无法提供任何封装性。

加入有的编译允许static整型class常亮完成 in class初值设定,可以改为 the enum hack补偿做法。
class Gameplay

private:
enum{ Num=5 };
int scoure[Num];
}
enum hack的行为更像一个有封装的define,例如取一个const的地址是合法的,去一个enum的地址是不合法的,取一个defind的地址也是不合法的。加入你不想使用一个pointer或者reference指向你的整数常亮,enum可以实现你的梦想。enum,defind可能导致内存中出现重复代码。

#define MaxFunc f((a)>(b))?(a):(b))
这种长相的宏用的太多,缺点也太多。
这种宏的实参一定要加上小括号,或使用do{}while(0)封装,即使加过小括号也有可能出现不可思议的事情。
int a=5,b=10;
MaxFunc(++a,b); //a累加两次
MaxFunc(++a,b+10); //a累加一次
通过inline解决函数宏定义问题
template
inline void MaxFunc(const T& a,const T& b)
{
f(a>b?a:b)
}
此时MaxFunc更像一个函数,遵循scope和访问权限,可以写一个class private inline函数,而宏不可以完成此类事情。

敲黑板画重点:对于单纯得变量,最好以const对象或者enum对象代替#define
对于形似函数的宏。最好用inline函数代替。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值