当前位置:  开发笔记 > 编程语言 > 正文

C++在预处理器#if中的sizeof()比较中抛出编译错误

如何解决《C++在预处理器#if中的sizeof()比较中抛出编译错误》经验,为你挑选了5个好方法。

我有这个不能编译与Visual Studio的错误"致命错误C1017:无效的整数常量表达式".我该怎么做?

template 
A *Create()
{
  #if sizeof(B) > sizeof(A)
  #error sizeof(B) > sizeof(A)!
  #endif
  ...
}

Josh Kelley.. 16

预处理器不理解sizeof()(或数据类型,或标识符,模板或类定义,并且需要了解所有这些以实现sizeof).

你正在寻找的是静态断言(由编译器强制执行,它确实理解所有这些事情).我使用Boost.StaticAssert:

template 
A *Create()
{
  BOOST_STATIC_ASSERT(sizeof(B) <= sizeof(A));
  ...
}


David Joyner.. 8

在编译器开始编译之前评估预处理程序表达式.sizeof()仅由编译器评估.



1> Josh Kelley..:

预处理器不理解sizeof()(或数据类型,或标识符,模板或类定义,并且需要了解所有这些以实现sizeof).

你正在寻找的是静态断言(由编译器强制执行,它确实理解所有这些事情).我使用Boost.StaticAssert:

template 
A *Create()
{
  BOOST_STATIC_ASSERT(sizeof(B) <= sizeof(A));
  ...
}



2> David Joyner..:

在编译器开始编译之前评估预处理程序表达式.sizeof()仅由编译器评估.



3> AnT..:

您无法使用预处理器执行此操作.预处理程序指令不能与这样的语言级元素一起运行sizeof.而且,即使它们可以,它仍然不起作用,因为预处理器指令很早就从代码中消除了,它们不能被期望作为稍后实例化的模板代码的一部分工作(这似乎是你试图尝试的实现).

正确的方法是使用某种形式的静态断言

template 
A *Create()
{
  STATIC_ASSERT(sizeof(B) <= sizeof(A));
  ...
}

那里有很多静态断言的实现.进行搜索并选择一个最适合您的搜索.



4> 小智..:

sizeof()不能在预处理程序指令中使用.


在过去,一些C/C++编译器实际上支持预处理器表达式中的sizeof.想到Turbo C++.
@Ramónster:即使是这样,您的代码仍然无法按照您希望的方式工作.您不能在模板参数上运行预处理指令.

5> Michael Burr..:

预处理器在编译器之前运行(至少在逻辑上它运行)并且不了解用户定义的类型(并且不一定了解内部类型 - 预处理器的int大小可能与编译器目标不同.

无论如何,要做你想做的事,你应该使用STATIC_ASSERT().请参阅以下答案:

在C语言中在构建时ASSERT表达式的方法

有了STATIC_ASSERT()你就可以做到这一点:

template 
A *Create()
{
    STATIC_ASSERT( sizeof(A) >= sizeof( B));
    return 0;
}

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有