Nic*_*ick 5 c c++ macros negation
我从Microsoft的GSL实现(C++指南支持库)中看到了这段代码:
#if defined(__clang__) || defined(__GNUC__)
#define GSL_LIKELY(x) __builtin_expect(!!(x), 1)
#define GSL_UNLIKELY(x) __builtin_expect(!!(x), 0)
#else
#define GSL_LIKELY(x) (!!(x))
#define GSL_UNLIKELY(x) (!!(x))
#endif
Run Code Online (Sandbox Code Playgroud)
我读到了__builtin_expect(这里和这里),但我仍然不清楚双boolean否定运算符的目的是什么(!!(x)).为什么用它?
有问题的文件就是这个.
__builtin_expect在严格相等的情况下工作,所以这里的双重否定点是确保所有的真值都转换为1(从而匹配1 GSL_LIKELY),并且所有的虚假值都匹配0 in GSL_UNLIKELY.
即使__builtin_expect无法保持一致性,也可以保持双重否定(因为调用者可以将其他用途的返回值存储起来除了作为条件if).
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |