没有定义的结构用作指针

Struct without definition used as pointer

本文关键字:指针 结构 定义      更新时间:2023-10-16

我遇到了一些代码,看起来像是向前声明结构,但我在代码库中找不到该结构的任何定义。它似乎被当作结构被定义一样使用。有人可以解释为什么下面的代码是有效的 c++ 吗?

框架是什么类型?尺寸是多少?我不能使用 sizeof(),因为它会抱怨它是未定义的。

我正在尝试从2010年开始将一段类似的代码转换为Visual Studio 2015。reinterpret_cast演员抱怨它无法转换,因为

"reinterpret_cast":从"无符号长整型"转换为"帧*" 更大的尺寸

#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 吗?

程序行为是未定义的,因为从unsigned longFrame*的转换,其中前者设置为与您可以设置的指针值无关的值不符合 http://en.cppreference.com/w/cpp/language/reinterpret_cast 中提到的可能性之一。

printf似乎输出指针地址这一事实是这种未定义行为的表现。

Frame是不完整的类型这一事实在这里无关紧要。除了nullptr,一个超过标量(即单个对象或普通旧数据对象)的地址,一个超过数组的末尾,将指针类型设置为你不拥有的内存的行为也是未定义的

由于您仅将Frame用作指针,因此编译器不需要了解有关Frame结构本身的任何信息。这就像使用不透明的指针指向某物而不关心指向的内容。

强制转换失败unsigned long因为根据操作系统和数据模型(例如 LLP64 与 LP64),不能保证指针的大小相同。您应该考虑使用<stdint.h>中的intptr_t保证能够存储指针的所有位,但我不明白您如何需要将文字重新插入内存地址。