在C++中前向声明匿名结构体

10

我有一个第三方C库,其中包含类似于匿名结构的内容。

    typedef struct
     {
      ...
      }A;

该文件是通过程序自动生成的,因此可能会根据某些条件发生更改。

现在,在C++项目中,我接受上述类型的参数,例如:

  void foo(const A & in)
  {
    ...
  }

如何在定义上述函数的头文件中进行A的前向声明?

我尝试过:

 typedef struct A A;
或者
 struct A;

还有

 typedef A A;

出于好奇心。

然而,这些会导致编译时错误,重新定义了类型。 谢谢。


你能不能不包含定义typedef struct{...} A;的库的头文件? - rjp
这不是一个匿名的 struct (请参见 C 标准中的 6.7.2.1p13)。您无法在 structunion 外部拥有匿名的 struct - too honest for this site
C不是C++。只需使用C++标准。不清楚您的问题在哪里,我看不到任何问题。使用typedef的名称有什么问题? - too honest for this site
你不能前向声明一个typedef。但你可以使用带标签的结构体来实现:typedef struct tag_A{...}A - LPs
前几天有人问了一个与Simulink生成的代码几乎相同的问题,我真的很想知道为什么无法包含头文件。 - rjp
@rjp:就像我所说的那样:实际问题不清楚。我想知道是谁会点赞这样的问题。 - too honest for this site
2个回答

9
很遗憾,你没有运气了。 A 是一个无标记的 structtypedef。由于你不能直接引用这个 struct,所以你不能前向声明它。
你能更改生成器让其输出typedef struct A { ... } A;吗?这样在 C 和 C++ 中都可以很好地编译,并且你可以在 C++ 中前向声明它。
否则你有两个选择:1. 包含包含这个struct声明的文件。2. 手动复制这个 struct。显然 (1) 更可取。

2
这是一个未标记的 struct,而不是无名的。 - too honest for this site
@Olaf:非常有帮助。我一直在寻找正确的术语。 - Bathsheba
只是想澄清一下:我使用 C 术语,只是推断出标签丢失了,因此我认为 "无标记" 将是正确的名称。 - too honest for this site
这是一个很好的答案,在我看来。关于“显然(1)更可取”,我认为这是一种权衡。它肯定更健壮和DRY;另一方面,由于OP声明文件是自动生成的,它可能会触发冗余构建。这实际上取决于文件生成频率与未标记结构实际更改频率之比。 - Ami Tavory
谢谢!我已经更改了生成器以为结构体提供标签,现在编译正常。 - user6386155

1
你不能这样做,因为类型别名不能被前向声明,只有实际的类型可以。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接