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

-W转换和隐式字符串到布尔类型转换

c++
  •  1
  • ivaigult  · 技术社区  · 1 年前

    我习惯了写这个成语:

    assert(!"Something went wrong");
    

    但现在 -Wconversion 已在项目中启用,并且此代码不再编译:

    error: implicit conversion turns string literal into bool
    

    我知道,如果我明确地抛出它,错误就会消失,但它太麻烦了:

    assert(!static_cast<bool>("Something went wrong"));
    

    有没有更优雅的解决方案?

    4 回复  |  直到 1 年前
        1
  •  4
  •   abelenky    1 年前

    这可能会起作用,具体取决于您的所有特定编译器设置:

    assert( ("Something went wrong", false) );
    

    内部表达式使用逗号运算符计算为false,同时仍保持字符串文字的可读性。

    您可能可以替换 false 具有 0 为了简洁起见。

        2
  •  4
  •   ivaigult    1 年前

    我想出的另一个:

    assert(!&"Something went wrong");
    

    这将起作用 &"Something went wrong" 是常量字符串的地址,该字符串必须为非null。和 ! 会否定它,所以,这是一个 false

        3
  •  3
  •   3CxEZiVlQ    1 年前

    我的选择,比之前回答的短:

    assert(!"something went wrong"[0]);
    assert(!*"something went wrong");
    
        4
  •  3
  •   Thomas Weller    1 年前

    如果需要平铺直叙 cassert ,我会选择

    assert(0 && "something went wrong");
    

    这应该是由于短路 && 0 是“truthy”(隐含地可转换为bool)。

    否则,通常使用更好的断言库,如 snowhouse libassert

        5
  •  0
  •   Artyer    1 年前

    带有消息的断言的常用用法是:

    assert(condition_that_should_be_true && "something went wrong");
    

    如果你想无条件地失败,你可以提出这个条件 false 以下为:

    assert(false && "something went wrong");
    

    但请注意,您很少需要这样做。例如:

    if (!check_conditions()) assert(false && "something went wrong");
    // Can simply be
    assert(check_conditions() && "something went wrong");