【问题标题】:Why is assert defined as (void)0?为什么assert定义为(void)0?
【发布时间】:2016-07-19 15:54:50
【问题描述】:

为什么 #define assert(expression) ((void)0), 而不是 #define assert(expression) 是在release模式下使用的?(严格来说,定义NDEBUG的时候)

听说有一些原因,但我忘记了。

【问题讨论】:

  • 之后通常会有一个;,如果assert变成了空,那孤独的剩余;可能会触发警告。
  • 后者允许assert(true)(不带分号),而前者不允许。
  • @MarcGlisse 您应该将其发布为答案。目前,您的评论是唯一能真正回答发帖人问题的陈述。

标签: c++ c-preprocessor noop


【解决方案1】:

((void)0)empty macros 中使用的原因是让它们表现得像一个函数,在某种意义上你需要在末尾指定分号;

例如:

#define assert1(expression) (void)0
     assert(1) // compile error, missing ;

#define assert2(expression) 
     assert(1) // works

【讨论】:

    【解决方案2】:

    ((void)0) 定义 assert(expression) 什么都不做。
    使用它的主要原因是#define assert(expression) 将允许assert(expression) 在没有分号的情况下进行编译,但如果宏定义为((void)0),它将无法编译

    【讨论】:

    • #define assert(expr)有什么区别?
    猜你喜欢
    • 2017-04-19
    • 2014-01-08
    • 1970-01-01
    • 2020-02-24
    • 2018-11-18
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多