LCC:Typedef 枚举的前向声明失败?
以下代码片段在使用 gcc 的 Mac OS X 上编译得很好,但在使用 lcc-win32 的 Windows 上编译失败:
typedef enum Foo Foo;
// Other code here
enum Foo { Bar = 1 };
并给出以下错误:
未知枚举“Foo”
在我的特定情况下,这不是问题。我只是将这些语句合并为:
typedef enum Foo { Bar = 1 } Foo;
但我想知道 LCC 是否“更严格”(遵守某些标准)或“更愚蠢”(编译器太愚蠢,无法处理这种情况)。
谢谢。
另外,请参阅我的其他 LCC 问题:LCC:初始化包含结构的结构?
The following code snippet compiles just fine on Mac OS X with gcc, but fails to compile on Windows with lcc-win32:
typedef enum Foo Foo;
// Other code here
enum Foo { Bar = 1 };
And gives this error:
unknown enumeration 'Foo'
In my particular case, this was not a problem. I simply combined the statements into:
typedef enum Foo { Bar = 1 } Foo;
But I'm wondering if LCC is being either "more strict" (adhering to some standard) or "more dumb" (the compiler is too dumb to handle this situation).
Thanks.
Also, please see my other LCC question: LCC: Initializing Structs Containing Structs?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
枚举的前向声明是非标准的(它们违反了 C99 第 6.7.2.3 §3 节),如果您添加
-pedantic
标志(如果编写可移植代码,则应该使用该标志),gcc 也会发出警告。原因是实现可以自由选择与 int 不同的整数类型来表示枚举(请参见 C99 第 6.7.2.2 §4 节)。然而,为了使其发挥作用,编译器必须先查看它需要表示的所有值,然后才能选择适当的类型。
Forward declarations of enumerations are non-standard (they violate C99 section 6.7.2.3 §3) and gcc will warn as well if you add the
-pedantic
flag (which you should use if writing portable code).The reason for this is that implementations are free to choose an integer type different from
int
to use for representing the enumeration (see C99 section 6.7.2.2 §4). However, for that to work, the compiler has to see all values it needs to represent before an appropriate type can be chosen.