• 尽量使用const,enum,inline替换 #define

    因为,#define 替换发生在预处理阶段,编译器对这个替换内容就缺少了类型检测,并且不利于错误信息的查看

  • 编译器再声明数组时必须知道数组的大小,而不是使用一个变量,我便有了如下测试

  1. 枚举类型做数组大小(在类中做成员)
class GamePlayer {
private:
enum { NumTurns = 5 } ;
int scores[NumTurns];
};

可行,编译器看到的

class GamePlayer
{ private:
enum
{
NumTurns = static_cast<unsigned int>(5)
}; int scores[5]; //这里发生了替换
};
  1. const类型做数组大小(在类中做成员)
class GamePlayer {
private:
const int NumTurns = 5;
int arr[NumTurns];
//error: invalid use of non-static data member 'NumTurns'
//错误不会发生替换
};

将变量变为static时就可以通过编译了

class GamePlayer {
private:
static const int NumTurns = 5;
int arr[NumTurns];
};

可行,编译器看到的

class GamePlayer
{
private:
static const int NumTurns = 5;
int arr[5];
};
  1. 枚举类型做数组大小(函数中)
void func()
{
enum { NumTurns = 5 } ;
int scores[NumTurns];
}

可行,编译器看到的

void func()
{
enum
{
NumTurns = static_cast<unsigned int>(5)
}; int scores[5];
}

当然类的成员函数中也是一样可行的

  1. const类型做数组大小(在函数中)
void func()
{
const int NumTurns =5;
int scores[NumTurns];
}

可行,编译器看到的

void func()
{
const int NumTurns = 5;
int scores[5];
}

经过验证在类的成员函数中也是一样可行的

enum hack 的行为某方面说比较像#define 而不像 const, 有时候这正是你想要的。例如取一个 const的地址是合法的,但取一个 enurn 的地址就不合法,而取一个#define 的地址通常也不合法。

如果你不想让别人访问你的指针或引用所指向的某个整数常量,enum可以帮助实现。原因是对enum类型变量取地址是不合法的

  • 存在的问题

    enum hack 时模板元编程的基础技术 不能理解

  • 要记住

    对于单纯的常量,最好以const对象或emums替换#define

    对于宏函数,最好改用inline函数替换#define

最新文章

  1. spring笔记--使用springAPI以及自定义类 实现AOP的一个例子
  2. 对一个二维数组进行升序排列a[0][1]为最小
  3. 关于JAVA的String类的一些方法
  4. HTML里的id等属性命名需要注意
  5. SpringMVC 3.1集成Spring Security 3.1
  6. python 学习(一)
  7. C# 当前程序所有线程
  8. CentOS自带mysql配置(密码更改、端口开放访问、添加进系统启动项)
  9. 为什么覆写equals()方法的时候总是要覆写hashcode()?
  10. BZOJ 3790: 神奇项链 [Manacher 贪心]
  11. 《android开发艺术探索》读书笔记(六)--Drawable
  12. TCP的三次握手与四次挥手(个人总结)
  13. Android RadioGroup 学习
  14. bootstrap排列顺序
  15. linux下安装python,Django,虚拟环境
  16. 性能测试七:jmeter进阶之文件上传下载、定时器
  17. zyb的面试(广工14届比赛)
  18. 根据list集合某个字段进行排序
  19. RTMP与HLS压力测试工具安装与配置
  20. springmvc中的拦截器interceptor用法

热门文章

  1. CSS 属性选择器 ~=, |=, ^=, $=, *= 的区别
  2. 【单元测试】Junit 4(三)--Junit4断言
  3. Aspose.Cell和NPOI生成Excel文件2
  4. OpenFOAM 编程 | 求解捕食者与被捕食者模型(predator-prey model)问题(ODEs)
  5. chrome工具调试
  6. Go实现栈与队列基本操作
  7. K8s 生产最佳实践-限制 NameSpace 资源用量
  8. 超精准!AI 结合邮件内容与附件的意图理解与分类!⛵
  9. 我的第一个项目(二):使用Vue做一个登录注册界面
  10. MyEclipse反编译插件安装于使用