这种无操作 while 循环用于断言宏的原因是什么?
What's the reason for this no-op while-loop used for assert macro?
我正在审查一个代码库,其中assert
宏在非调试配置中像这样展开:
#define assert( what ) while( 0 )( ( void )1 )
我不太明白。很明显,我们的目标是不做手术。那么为什么不展开成一个空字符串呢?
#define assert( what )
这个无op循环的原因是什么?
最有可能避免编译器警告。检查这段代码是否引发关于空语句的警告:
if (foo);
如果是,那么您是否希望在发布模式下对以下代码发出相同的警告?
if (foo) assert(what);
C99(与c++ 11相关)还说assert
展开为"一个空表达式"。在IIRC中,单独的空格不是表达式,即使空格后跟分号是表达式语句。好旧的BNF语法。
顺便说一下,assert
的这个定义是不符合标准的。C89和C99都说当NDEBUG
被定义时,断言被定义为:
#define assert(ignore) ((void)0)
我不确定作者是否认为这是一个重要的要求,但是一个程序可以例如字符串化宏展开并期望一个特定的结果。
很可能是为了吞下分号。不管是否需要,我认为这不会有太大的区别,但同时,它也不会伤害任何东西。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- 在C 中,对2D数组的增量是什么?函数断言(0)做什么?
- 是什么导致我的C 代码中的断言错误
- 错误 opencv 错误断言失败 (p [-1] <= 2) 是什么意思以及如何处理它?
- 将派生类对象分配给基类对象时会发生什么(我的意思是对象断言,而不是指针)
- 什么是调试断言?如何将一行的单词放入数组中
- 断言(0)是什么意思
- 打破gdb中失败断言的正确方法是什么
- 这种无操作 while 循环用于断言宏的原因是什么?
- 在C++中实现断言检查的最佳方法是什么