C陷阱:判断宏是否等于一个常数
下面这段代码有啥错误?
1 2 3 4 5 6 7 |
#if ULONG_MAX == 0xFFFFFFFF inline unsigned long byte_swap(unsigned long x) { return __builtin_bswap32(x); } inline long byte_swap(long x) { return __builtin_bswap32(x); } #else inline unsigned long byte_swap(unsigned long x) { return __builtin_bswap64(x); } inline long byte_swap(long x) { return __builtin_bswap64(x); } #endif // ULONG_MAX |
当 ULONG_MAX 未定义时,被判断为假!多么危险的一个陷阱!
增加以下验证即可查错:
1 2 3 4 5 6 7 8 9 |
#ifdef ULONG_MAX # if ULONG_MAX != 0xFFFFFFFFul # if ULONG_MAX != 0xFFFFFFFFFFFFFFFFul # error "ULONG_MAX error" is ULONG_MAX # endif # endif #else # error "ULONG_MAX is not defined" #endif |
这个 bug 耗费了我两个小时!
你这种方式,还不是没有解决。
当ULONG_MAX 没有定义也只是 报个错。
看你代码用了不少模板,这个干嘛不用模板搞定。
如:
template<int nSize>
unsigned long __T_byte_swap(unsigned long x);
template<>
unsigned long __T_byte_swap<4>(unsigned long x){return __builtin_bswap32(x);}
template<>
unsigned long __T_byte_swap<8>(unsigned long x){return __builtin_bswap64(x);}
#define byte_swap(x) __T_byte_swap<sizeof(long)>(x)
回复 orochi717:模板是可以解决问题,但是,代码写得多了,你就会知道,如果模板不能带来额外的好处,还是少用为妙