启用-Wconversion后assert(!字符串字面量)编译报错,求更优雅解决方案
问题描述
我习惯写这样的C++断言代码:
assert(!"Something went wrong");
但项目启用-Wconversion编译选项后,这段代码无法编译,报错:
error: implicit conversion turns string literal into bool
我知道可以通过显式转换消除错误,但写法太繁琐:
assert(!static_cast<bool>("Something went wrong"));
有没有更优雅的解决方案?
优雅解决方案
这里有几种简洁的写法,既能满足-Wconversion的编译要求,又保持代码可读性:
方法1:逻辑与组合写法
利用字符串字面量非空即真的特性,直接通过false && 字符串的形式构造断言,编译器不会触发隐式转换警告,同时断言失败时仍会输出对应字符串:
assert(false && "Something went wrong");
方法2:封装宏简化调用
如果这类带消息的断言使用频繁,可以封装一个宏来避免重复编写模板代码:
#define ASSERT_WITH_MSG(msg) assert(false && (msg)) // 使用示例 ASSERT_WITH_MSG("Something went wrong");
方法3:显式构造字符串对象
虽然比前两种稍长,但比static_cast更直观,不过会构造临时std::string对象(性能影响可忽略,极端敏感场景优先选前两种):
assert(!std::string("Something went wrong"));
内容的提问来源于stack exchange,提问作者ivaigult
相关产品推荐
相关产品推荐

