0

我最近看到以下代码:

#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)吗?

4

1 回答 1

1

它对你有用吗?

#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改用它,它会产生优雅的错误消息(并且只有一条错误消息!)。

于 2012-02-22T15:33:13.987 回答