Ram*_*ter 4 c++ sizeof c-preprocessor
我有这个不能编译与Visual Studio的错误"致命错误C1017:无效的整数常量表达式".我该怎么做?
template <class B>
A *Create()
{
#if sizeof(B) > sizeof(A)
#error sizeof(B) > sizeof(A)!
#endif
...
}
Run Code Online (Sandbox Code Playgroud)
Jos*_*ley 16
预处理器不理解sizeof()(或数据类型,或标识符,模板或类定义,并且需要了解所有这些以实现sizeof).
你正在寻找的是静态断言(由编译器强制执行,它确实理解所有这些事情).我使用Boost.StaticAssert:
template <class B>
A *Create()
{
BOOST_STATIC_ASSERT(sizeof(B) <= sizeof(A));
...
}
Run Code Online (Sandbox Code Playgroud)
您无法使用预处理器执行此操作.预处理程序指令不能与这样的语言级元素一起运行sizeof.而且,即使它们可以,它仍然不起作用,因为预处理器指令很早就从代码中消除了,它们不能被期望作为稍后实例化的模板代码的一部分工作(这似乎是你试图尝试的实现).
正确的方法是使用某种形式的静态断言
template <class B>
A *Create()
{
STATIC_ASSERT(sizeof(B) <= sizeof(A));
...
}
Run Code Online (Sandbox Code Playgroud)
那里有很多静态断言的实现.进行搜索并选择一个最适合您的搜索.
小智 6
sizeof()不能在预处理程序指令中使用.
预处理器在编译器之前运行(至少在逻辑上它运行)并且不了解用户定义的类型(并且不一定了解内部类型 - 预处理器的int大小可能与编译器目标不同.
无论如何,要做你想做的事,你应该使用STATIC_ASSERT().请参阅以下答案:
有了STATIC_ASSERT()你就可以做到这一点:
template <class B>
A *Create()
{
STATIC_ASSERT( sizeof(A) >= sizeof( B));
return 0;
}
Run Code Online (Sandbox Code Playgroud)