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