Visual Studio sizeof 非法操作数

3

我目前正在将一个在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::,但仍无法解决。奇怪的是,当我用鼠标悬停在sizeof上时,VS2010给出了正确的值,但无法编译。为什么会这样?

尝试使用<type_traits>中的sizeof(decltype(std::declval<MetaStruct>().pdata)) - Kerrek SB
@BoPersson:我想问题的重点是如何表达而不重复类型!(如果您愿意,可以使用DRY解决方案。) - Kerrek SB
确实很奇怪。您能否删除其他sizeof以确保我们正在查看正确的内容? - ixe013
@Kerrek - 这就是为什么我加了笑脸,我的代码解决问题的代码大小只有你的四分之一。很明显他想要结构体的大小而不是指针。 - Bo Persson
你试图解决什么问题?你真的在寻找 offsetof(MetaStruct, pData) 或者甚至是 void*(MetaStruct::*p) = &MetaStruct::pData; 吗? - CB Bailey
我只是想查找结构体的大小,除了数据指针大小以外,以便通过套接字发送它。但现在问题已经解决 :) - Jukurrpa
1个回答

9

在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表达式。显然,这在VS2010中不受支持。
C ++11中还有一种新形式的sizeofsizeof ... ( identifier ),但这与此处无关。

那么为什么OP的原始版本可以在GCC编译? - Kerrek SB
1
第二个问题对于没有默认构造函数的类型来说是有问题的。sizeof ((MetaStruct*)0)->pData 看起来很丑,但在这种情况下可以使用。 - Mike Seymour
谢谢,虽然作为Kerrek SB,我想知道为什么sizeof(MetaStruct::pData)在GCC中能够工作。 - Jukurrpa
@hvd:有趣,我不知道这一点。即使在“-std=c++98 -pedantic”模式下,我的gcc似乎也允许它。 - CB Bailey
@CharlesBailey 还有趣的是,我认为这是一个错误。在C++标准的上一个更新之后,它仍然被允许,并且在此之前需要进行诊断。http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#613 - user743382
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接