【问题标题】:Visual Studio sizeof illegal operandVisual Studio sizeof 非法操作数
【发布时间】: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;

标签: c++ windows visual-studio visual-c++ sizeof


【解决方案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 中还有一种新形式的 sizeof:sizeof ... ( identifier ),但这与这里无关。

【讨论】:

  • 那么为什么 OP 的原始版本可以与 GCC 编译?
  • 第二个对于没有默认构造函数的类型是有问题的。 sizeof ((MetaStruct*)0)->pData 很丑,但在这种情况下可以工作。
  • @MikeSeymour:没错,我只是选择了最简单的表达方式来解决所问的问题。
  • 如果没有可访问的默认构造函数,您的解决方案是否有效?
  • 谢谢,虽然作为 Kerrek SB,我想知道为什么 sizeof(MetaStruct::pData) 与 GCC 一起工作。
猜你喜欢
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 2011-12-08
  • 1970-01-01
  • 2010-09-13
  • 2012-02-23
  • 2023-04-09
相关资源
最近更新 更多