1.首先#define 定义不重视作用域(scope),虽然可以#undef控制,但是不美观,还存在多次替换的问题,以及没有任何封装性.
2.const XXX_XX,保证其常量性以及可控的作用域,如果是指针类型则 const XXXX* const ptr="hello world",也可以完美替换#defin
3.enum hack 替换数组大小问题,和#define 一样不会导致非必要内存(只有在声明enum类型时有内存)
4.宏函数会产生很多问题,没有对参数的各种限制,而inline可以很好的解决
C/C++:
1 #include <iostream> 2 3 //Effective C++ NO.2 4 #define CALL_WITH_MAX(a,b) (a>b?a:b); 5 6 template <typename T> 7 inline int CALLWITHMAX(T a,T b) 8 { 9 return a>b?a:b; 10 } 11 12 13 14 15 #define STR "Hello Wolrd" 16 const char *const str = "Hello Wolrd"; 17 18 class Test 19 { 20 public: 21 //enum hack 22 enum{SIZE=20}; 23 int Array[SIZE]; 24 25 //旧版编译器可能需要类外初始化static,不能给数组大小赋值 26 static int size; 27 }; 28 29 int Test::size=20; 30 31 32 33 34 35 int main(int argc, char **argv) 36 { 37 int a=2,b=1; 38 //inline没有问题 39 std::cout<<CALLWITHMAX(++a,b)<<std::endl; 40 //宏函数造成的2次叠加 41 std::cout<<CALL_WITH_MAX(++a,b); 42 return 0; 43 }
注意: 对于纯常量,尽量使用const,或者enum替代
对于形似函数的宏,尽量使用inline替换
时间: 2024-12-21 05:10:55