2012-02-22 24 views
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样)?

+0

你可以做,告诉我们你是怎样尝试使用它你的问题更精确。像这样,msg参数没有被使用,这很奇怪。 – 2012-02-22 13:37:53

+2

出了什么问题'static_assert'? – 2012-02-22 13:44:00

+0

它不会在2010 MSVC工作,编译器不能检测到'1/INT(!!(e))的'是一个常数当我通过0作为'e'。 – 2012-02-22 13:45:33

回答

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代替,这将产生优雅的错误信息(和公正的一个错误消息!)。