读书笔记《Effective c++》 条款02 尽量用const,enum,inline代替#define

1.尽量用const,enum,inline代替#define

以编译器代替预处理器。

a.使用#define可能导致编译器错误信息不明显,而常量会进入符号表。

b.#define没有作用域的限定。

c.当编译器不支持类内静态常量初始化,而又必须使用此常量来定义数组时(编译器要求编译期就能计算出数组的长度),可以使用the enum hack,enmu{MAX_LEN = 50};the enum hack的行为更像是#define,比如可以取常量的地址,但是不能取enum的地址

结论:

a.对於单纯的常量,最好以const对象或enum代替#define;

b.对于形似函数的宏,最好以inline代替#define;

写例子时遇到的问题:

a.对于未使用的变量和参数,编译器会提出警告,可以使用UNDEFINED_PARAM之类的宏修饰,也可以直接使用一个空函数模板,类似这种 template<typename T> void UNUSED_VAR(const T&){}; 这样来生成一个空函数调用,编译器也会将其优化掉。

b.一个网上看到的问题,对于引用,T const& a和const T& a其实没有什么区别(类似指针),当然和T & const a是有区别的,比如后者不能接受常量(因为这里需要一个左值),不过个人认为这种写法很奇怪,毕竟引用其实本身应该是包含const的含义


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章