c++ - 这个静态断言能正常工作吗?

标签 c++ static-assert

我最近看到以下代码:

#define MY_ASSERT_CONCAT_(a, b) a##b
#define MY_ASSERT_CONCAT(a, b) MY_ASSERT_CONCAT_(a, b)
#define MY_STATIC_ASSERT(e,msg) enum { MY_ASSERT_CONCAT(assert_line_,__LINE__) = 1/int(!!(e)) }

它会按预期工作吗(类似于 BOOST_STATIC_ASSERT)?

最佳答案

它对你有用吗?

#define MY_STATIC_ASSERT(e,msg) \
{   \
        int MY_ASSERT_CONCAT(assert_line_,__LINE__)[!!e]; \
        MY_ASSERT_CONCAT(assert_line_,__LINE__); \
}

它试图声明一个大小为 1 或 0 的数组,具体取决于表达式。它只适用于 VC,因为 GCC 允许零大小的数组(默认情况下)。第二种用法只是使用变量,这样编译器就不会发出“未使用的变量”警告。 请注意,反斜杠 (\) 后没有空格,它适用于 VC。要么将其更改为单行宏,要么在您的编译器中使用适当的替代方法。

我建议改用 static_assert,它会产生优雅的错误消息(而且只有一条错误消息!)。

关于c++ - 这个静态断言能正常工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9395762/

相关文章:

c++ - 创建结构的二维数组会导致崩溃

c# - C# 中 WORD 的等价物是什么?

c++ - 从 C++ 使用 MySQL 控制结构

c++ - 为每个类获取 int Id,使用类名及其对象调用

c++ - 如何在不同的 std::chrono 持续时间类型之间进行转换?

c++ - 如何用宏做static_assert?

c++ - 为什么模板中的 static_assert 使用等效表达式会给我不同的结果?

c++ - 为什么 is_default_constructible<Class>::value 在同一类范围内失败

c++ - 如何将类型的名称作为字符串嵌入到 static_assert() 中?

c++ - 类模板参数的static_assert