【问题标题】:How to work around declaring typedefs in C++ headers如何解决在 C++ 标头中声明 typedef
【发布时间】:2012-08-31 09:15:47
【问题描述】:

我想知道是否有人可以在不进行重组的情况下就解决这种情况的方法提供建议:我有一个包含类声明的标头并声明了许多通过引用/指针使用的类,这显然是比较好的做法简单地包含这些类的标题。

struct Foo;

struct Bar;

struct MyStruct
{
    void doIt( const Foo* foo );

    void doIt( const Bar* bar );
};

然而,虽然在上面的例子中 Foo 是一个类,但 Bar 实际上是一个类的 typedef,如下面的粗略例子:

#include <fd_ex.h>

struct Foo
{
   int a;
};

struct Bar_
{
   int a;
};

typedef Bar_ Bar;

这会导致一些问题,因为预先声明 struct Bar 显然不正确 - Bar 不是结构:

"fd_ex.cpp", line 13: Error: Multiple declaration for Bar.
"fd_ex.cpp", line 19: Error: The name Bar is ambiguous, Bar and Bar.
2 Error(s) detected.

如果可能的话,我不想公开Bar_,主要是因为在现实生活中这可能比这个例子复杂得多。

但是,如果我 无法控制 Bar 的 struct 声明和 typedef,我是否可以在 MyStruct 的标头中使用任何技术来保持 pre-声明Bar?

【问题讨论】:

  • 我猜你的编译器只是混淆了你将 bar 预定义为一个类,然后(通过 typedef)作为结构 Bar_。尝试使用 struct bar;而是在您的头文件中。另外,在无意义地抨击别人使用结构体之前,请记住msdn.microsoft.com/en-us/library/ms229017.aspx这一点;-)
  • 你基本上是在说,“我想声明一个函数,但我不会告诉你参数的类型。”你不能那样做。
  • @Najzero:它们实际上都是结构,但对于这个例子来说并不重要,因为Bar 既不是类也不是结构。我将更改示例以使其更清晰,但为免生疑问,它仍然没有帮助。
  • @KerrekSB:我想知道的是如何通过预先声明一个实际上不是结构而是 typedef 的结构来告诉编译器 Bar 是什么而不会混淆它。
  • @Component10:如果你拒绝告诉编译器 Bar 是什么,你就不能告诉编译器 Bar 是什么!唯一正确的方法是声明typedef struct Bar_ Bar;,这就是Bar

标签: c++ class header typedef


【解决方案1】:

我不确定它在 C++ 中是否完全一样,但在 C 中,我经常声明“不透明”结构,它在头文件(比如 mystruct.h)中具有:

typedef struct MyStruct_ MyStruct;

// + function prototypes using MyStruct*

然后我可以使用指向 MyStruct 的指针而不实际知道它是什么,例如:MyStruct *x;,但不是 MyStruct x[3];(因为编译后不知道 MyStruct 的大小)

然后在源文件mystruct.c 中定义struct MyStruct_

所以我认为你可以尝试替换:

class Bar;

与:

typedef struct Bar_ Bar;

(在 c++ 中你可能只说 typedef Bar_ Bar;

【讨论】:

    【解决方案2】:

    您可以转发声明结构本身:

    struct Bar_;
    
    typedef Bar_ Bar; 
    
    class MyClass
    {
      void DoIt( Bar* );
    };
    

    【讨论】:

    • 或者甚至typedef struct Bar_ Bar; 在一行中......但我认为OP不希望任何人在标题中说Bar_
    • @PaulManta:如果可能的话,暴露Bar_结构定义和Bar_符号是有区别的。
    • @PaulManta:我说的是“我不想公开 Bar_如果可能” - 主要原因是实际代码中的一些 typedef更改非常复杂,如果可能的话,我宁愿不逐字重复它们。这主要是因为 (a) 它增加了额外的维护开销,并且 (b) 它可能 暴露了我不想在标题中显示的细节。也就是说,在我看来,stijn / Kerrek SB 的提议是(可能唯一的)前进方向。
    【解决方案3】:

    这应该可以解决问题:

    struct Bar_;
    typedef Bar_ Bar;
    

    【讨论】:

      猜你喜欢
      • 2016-12-17
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2022-08-09
      • 2014-07-27
      • 2013-06-16
      相关资源
      最近更新 更多