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 中还有一种新形式的 sizeof
:sizeof ... ( 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++ 编译器错误