Visual Studio sizeof 非法操作数

Posted

技术标签:

【中文标题】Visual Studio sizeof 非法操作数【英文标题】:Visual Studio sizeof illegal operand 【发布时间】:2012-02-11 14:06:32 【问题描述】:

我目前正在将在 Linux 上开发的程序移植到 Win32。在其他问题中,我有一个非常奇怪的问题。 头文件包含如下内容:

namespace Networking 
  struct  MetaStruct
  
    int   iDataType;
    int   iDataSize;
    void* pData;
  ;

  const int MetaStructSize = sizeof(MetaStruct) - sizeof(MetaStruct::pData);
;

这在 Linux 上可以正常编译,但在使用 VS2010 为 Win32 编译时出现此错误: Networking.hpp(50): error C2070: '': illegal sizeof operand

我尝试在MetaStruct 之前添加Networking::,但它并没有改变任何东西。奇怪的是,当我用鼠标悬停它时,VS2010 给了我sizeof 的正确值,但不会编译它。为什么?

【问题讨论】:

试试sizeof(decltype(std::declval<MetaStruct>().pdata)),来自<type_traits> @BoPersson:我想问题的重点是如何在不重复类型的情况下表达这一点! :-)(如果您愿意,可以使用 DRY 解决方案。) 确实很奇怪。您能否删除其他 sizeof 以确保我们查看的是正确的? @Kerrek - 这就是我有笑脸的原因。我的代码以四分之一的代码大小解决了这个问题。很明显,他想要没有指针的结构的大小。 您要解决什么问题?你真的在找offsetof(MetaStruct, pData) 甚至void*(MetaStruct::*p) = &MetaStruct::pData; 【参考方案1】:

在 C++03 中有两种形式的 sizeof 表达式(参见 ISO/IEC 14882:2003 5.3.3 [expr.sizeof])。

sizeof unary-expression
sizeof ( type-id )

MetaStruct::pData 既不是有效的表达式(解析为对象类型)也不是类型的名称。

你必须这样做

sizeof( void* )

sizeof MetaStruct().pData

更新:感谢@hvd,他指出这在 C++11 中实际上应该是合法的。

您现在可以使用 id-expression 在不计算的上下文中引用类的非静态成员。显然这不受 VS2010 支持。

在 C++11 中还有一种新形式的 sizeofsizeof ... ( identifier ),但这与这里无关。

【讨论】:

那么为什么 OP 的原始版本可以与 GCC 编译? 第二个对于没有默认构造函数的类型是有问题的。 sizeof ((MetaStruct*)0)->pData 很丑,但在这种情况下可以工作。 @MikeSeymour:没错,我只是选择了最简单的表达方式来解决所问的问题。 如果没有可访问的默认构造函数,您的解决方案是否有效? 谢谢,虽然作为 Kerrek SB,我想知道为什么 sizeof(MetaStruct::pData) 与 GCC 一起工作。

以上是关于Visual Studio sizeof 非法操作数的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio sizeof() IntelliSense 与编译时的区别

Visual Studio 在使用指针和 strncat 时触发断点

奇怪的 Visual Studio 2008 C++ 编译器错误

C语言visual studio警告:取消对NULL指针“p”的引用

visual studio2017社区版如何空格操作?

visual studio 2013 怎么发布网站到服务器的iis?求具体操作步骤