代码之家  ›  专栏  ›  技术社区  ›  ma1169

宏:不应忽略void值

  •  0
  • ma1169  · 技术社区  · 7 月前

    我试图制作一个返回布尔值的简单断言宏,但我总是得到一个void函数。

    #define FALSE 0
    #define TRUE !FALSE
    
    #define CASSERT(predicate) \
     ({ \
        if((predicate)) \
        { \
            (TRUE); \
        }else\
        { \
            __debugbreak(); \
           (FALSE); \
        }})
    

    我想这样使用它

    if(!CASSERT(X==Y)){}
    

    这就是我得到的错误

    error: void value not ignored as it ought to be
    
    error: could not convert '<statement>' from 'void' to 'bool'
    

    我尝试了这段代码的一些变体,但似乎都不起作用!CASSERT的输出是一个空函数!

    1 回复  |  直到 7 月前
        1
  •  0
  •   Chris    7 月前

    自己执行文本替换。

    if(!CASSERT(X==Y)){}
    

    成为:

    if(!{
        if((X==Y)) {
            (TRUE);
        }
        else {
            __debugbreak();
            (FALSE);
        }}) {}
    

    这看起来像有效的C代码吗?它不是,因为有条件 陈述 不是返回布尔值的表达式。

    您可能希望使用条件 表达 使用逗号运算符对 __debugbreak() FALSE 。类似于:

    #define CASSERT(PRED) ((PRED) ? TRUE : (__debugbreak(), FALSE))
    

    您的代码现在将扩展为:

    if(!((X==Y) ? TRUE : (__debugbreak(), FALSE))) {}
    

    那个 是有效的C代码。