【问题标题】:Error when forward declaring a struct: "has a previous declaration here"前向声明结构时出错:“此处有先前的声明”
【发布时间】:2011-02-12 10:42:48
【问题描述】:

在构建我的小型 C++ 项目时,出现以下 2 个错误,无法找出原因:

  • 错误:在 'struct' 之后使用 typedef-name 'TTF_Font'。
    指向以下代码行:Foo.h 中的struct TTF_Font;

  • 错误:“TTF_Font”在此处有先前的声明。
    指向以下代码行:SDL_ttf.h 中的typedef struct _TTF_Font TTF_Font;

我已将其范围缩小到新测试项目中的以下文件:

Foo.h:

#ifndef FOO_H
#define FOO_H

struct TTF_Font;

class Foo
{
    TTF_Font* font;
};

#endif // FOO_H

Foo.cpp:

#include "Foo.h"
#include "SDL/SDL_ttf.h"

// No implementation, just testing

Main.cpp:

#include "Foo.h"
int main(int argc, const char* argv[])
{
    Foo a;
    return 0;
}

你们知道我做错了什么吗?

我的目标是转发声明 TTF_Font,这样我就可以在我的头文件中使用它而不包括 SDL_ttf 头文件。我读到在其他头文件中包含头文件是一种不好的做法,所以我切换到前向声明。除了这个单一的结构之外,我所有的其他前向声明都可以正常工作。

当我将前向声明 struct TTF_Font; 替换为包含 #include "SDL/SDL.ttf.h" 的标头时,它编译时不会出错。所以我可以使用它,但我想知道为什么,该死:-)。

额外信息:我正在使用带有 mingw32 编译器的 Code::Blocks IDE。项目使用 SDL 图形库。还没有多少C++经验,来自C#背景。

【问题讨论】:

  • 您确定Foo.cpp 的代码sn-p 正确吗?错误消息暗示Foo.h 中的内容发生在 包含SDL_ttf.h 之后。

标签: c++


【解决方案1】:

您正试图将某些内容转发为与实际不同的类型。

您正在声明:

struct TTF_Font;

当错误消息表明TTF_Font 实际上是typedef,而不是struct

typedef struct _TTF_Font TTF_Font;

stuct其实叫_TTF_Font

您可以多次声明相同的typedef,因此您可以只使用typedef 声明而不是前向声明来声明struct 并引入typedef,尽管感觉有点像您正在使用您尝试推迟的标头的实现细节包括。

【讨论】:

  • 谢谢!当我使用头文件中的相同 typedef 行时,它可以工作,但是就像您已经提到的那样,它有点使用 SDL_ttf 头文件的详细信息。这种事情有最佳实践吗?在这种情况下我应该省略前向声明并简单地包含头文件吗?
  • @void_Foo:一般来说,包含头文件是最安全的选择。如果有一种可接受的方式来转发从库或“仅声明”头文件中声明某些内容,那么库文档应该指出这一点。
【解决方案2】:

问题在于这段代码sn-p:

struct foo_t;

typedef struct foo { ... } foo_t;

第一行是一个 不同 结构的前向声明,其名称与typedef 冲突。这种情况下的前向声明需要是struct foo;,因为struct本身的名称是foo

【讨论】:

    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2017-04-05
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多