我遇到过一些代码看起来像是在向前声明一个结构但我在代码库中找不到结构的任何定义。似乎使用了结构定义。有人可以解释为什么下面的代码是有效的c ++?
Frame是什么类型的?大小是多少?我不能使用sizeof(),因为它会抱怨它是未定义的。
我正在尝试将类似的代码片段从2010年转换为Visual Studio 2015. reinterpret_cast演员抱怨由于事实而无法转换它
'reinterpret_cast':从'unsigned long'转换为'Frame *' 更大的尺寸
#include <stdio.h>
struct Frame;
int main()
{
unsigned long currentFrame = 5;
Frame* frame = reinterpret_cast<Frame*>(currentFrame);
printf("%p", frame);
}
GCC 4.9.2用于编译此示例。
我理解错误,但不明白结构是如何使用的。它是默认为int吗?
答案 0 :(得分:3)
程序行为 undefined ,作为从unsigned long
到Frame*
的转换,其中前者设置为与您可以设置的指针值无关的值不符合http://en.cppreference.com/w/cpp/language/reinterpret_cast中提到的其中一种可能性。
printf
似乎输出指针的地址这一事实表明了这种未定义的行为。
Frame
是不完整类型这一事实并不重要。除nullptr
之外,一个超过标量地址(即单个对象或普通旧数据对象),一个超过数组末尾,将指针类型设置为内存的行为不拥有也是 undefined 。
答案 1 :(得分:2)
由于您使用Frame
作为指针,编译器不需要了解Frame
结构本身的任何信息。这就像使用不透明的指针指向某些东西而不关心指向的东西。
转换失败,因为根据操作系统和数据模型(例如LLP64 vs LP64),unsigned long
不能保证与指针的大小相同。您应该考虑使用来自intptr_t
的{{1}},<stdint.h>
保证能够存储指针的所有位,但我不知道您需要如何将文字重新插入内存地址。