【问题标题】:Typedef enum declaration in C++C++ 中的 Typedef 枚举声明
【发布时间】:2012-03-02 10:28:12
【问题描述】:

我的问题很简单。 在 C++ 中,在如下声明中推迟 typedef 是否合法? gcc 可以毫无问题地接受代码,但这是不推荐使用的方式吗?我问这个是因为我发现每次在指令开头都带有 typedef 的样本。

enum _mytype {   
 A=1,   
 B=2 
} typedef mytype;

【问题讨论】:

  • 这是合法的 C++ 语法(根据语法,typedefdecl'ion-seq -> decl'ion -> block-decl'ion -> simple-decl'ion -> decl-spec-seq -> decl-spec),但我不确定语义是否明确。
  • 您意识到这种 typedef 约定在 C++ 中已经过时了吧?不再有做 typedef st_foo {...} foo; 之类的诱惑。在 C++ 中,因为它不是简写任何东西:无论哪种方式,我们都可以在没有 'struct foo' 的情况下编写 'foo'。同样不需要像 typedef en_foo {...} foo; 这样的东西。出于同样的原因。实际上,根据 BUFB aka Expert C Programming,甚至不推荐使用 typedef 隐藏“struct”或“enum”的 C 约定。
  • 并且使用以下划线开头的标识符并不是一个好主意。
  • 在 C 中,typedef 被视为存储类说明符(仅为了语法方便起见),并且将存储类说明符放置在声明开头以外的位置已过时。我认为 C++ 标准中没有类似的说法。
  • 这是最令人困惑的语法。您正在节省一行。加上你的变量名很臭(_mytype vs mytype)。为什么不只是省去麻烦,给枚举一个正确的名称,例如ABList,然后你就不需要typedef了。我唯一会使用 typedef 的类型是编译器不支持的类型,或者说一个向量声明,例如:typedef vector<Polygon> PolygonColl 所以我不必在方法参数中使用vector<Polygon>,我可以只使用PolygonColl thePolygons .

标签: c++ enums typedef


【解决方案1】:

typedef X Y;

X typedef Y;

只是用 C++ 编写完全相同的东西的两种方法。两者都没有被弃用,只是第一个更常用,也许是因为你可以把它读作“typedef X as Y”。

【讨论】:

  • +1。我曾经做过后一种风格来激怒我的一位同事,他有一个讨厌的习惯,即在他的代码上使用 1 空格缩进,同时修改我已经使用 4 空格缩进的代码。
  • @stinky472:你们都应该使用制表符缩进。空格缩进是令人讨厌的习惯。
  • @LightnessRacesinOrbit Blargh。这取决于您是否更喜欢跨编辑器的一致性。希望我们可以同意,至少制表符对任何东西都不好,除了留下缩进(而不是对齐一堆变量名),因为后者会对代码的格式造成严重破坏,除非整个团队对代表的空格数量进行标准化一个标签。
  • 请注意,后一种形式 在 C 中已 被弃用。在 C 中(但不是在 C++ 中),typedef 被视为 存储类 , 并且不推荐将 storage-class 作为第一个元素。 (弃用也不在 C++ 中。)
  • @0A0D:但你不会有 8 个空格的制表符。这是荒谬的。如果代码使用制表符,那么您可以为您的屏幕/窗口/显示器/眼睛/大脑选择它们的宽度。如果有人使用了空格,那么你不能。这就是重点。最后,我向您推荐我之前的评论,恭敬地坚决反对,并建议今天就这样。
【解决方案2】:

在 C 中你经常使用

typedef enum 
{
} what_ever;

因为在 C 中“enum what_ever”会定义一个类型“enum what_ever”而不是“what_ever”。但是在 C++ 中,情况并非如此,而且出于向后兼容性的原因,在编写 C++ 时不应在这种情况下使用 typedef。

【讨论】:

  • 我认为你应该再读一遍这个问题;我认为你根本没有回答。