【问题标题】:NS_ENUM gives compiler warning about forward referencesNS_ENUM 给出关于前向引用的编译器警告
【发布时间】:2013-01-28 11:23:25
【问题描述】:

我使用spiffy new NS_ENUM 尝试在我的objective-c iOS 项目中定义一个枚举。

我在类的标题中声明 NS_ENUM,如下所示:

NS_ENUM(int, SomeEnumType){
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
};

@interface Issue : NSObject
....

我收到编译器警告:

ISO C 禁止前向引用“枚举”类型

现在,如果我将枚举定义为(稍微)旧的传统方式,如下所示:

typedef enum{
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
}SomeEnumType;

@interface Issue : NSObject
....

在代码中完全相同的位置问题消失了。我在 NS_ENUM 上做错了什么?

编辑:

我通过添加 typedef 来纠正它,但它仍然给出警告。

我打开了迂腐的编译器警告。这只是它过于迂腐的情况还是我缺少正确的方法?

【问题讨论】:

  • 将它们放在头文件中,以便所有需要它们的文件都可以访问头文件并使用其中的声明。
  • 它在标题中。它在问题类的头文件中。
  • 也许这个stackoverflow.com/questions/7480217/…会帮助你

标签: iphone objective-c c enums compiler-warnings


【解决方案1】:

试试:

typedef NS_ENUM(int, SomeEnumType){
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
};

NS_ENUM 不会为你做 typedef 来声明 SomeEnumType 类型,你必须自己做。

更新: 出现警告的原因是由于 NS_ENUM 的实现。让我们看看它试图做什么:

#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type

问题线(我相信)是这样的:

enum _name : _type _name;

这是在宏本身内执行前向声明。因此,带有迂腐警告,它正在标记使用此功能。

迂腐的警告只是说明如果你想将它转换为纯 C,它不会是可移植的,因为它不遵循枚举的无前向声明的标准化。在 Xcode、Clang 和 LLVM(事实上 NS_ENUM 由 Apple 提供)的领域内,您应该是相当安全的。

【讨论】:

  • 很好,但我仍然收到警告。我已经打开了迂腐的编译器警告。还是缺少什​​么还是太迂腐了?
  • 是的。非常感谢您提供的额外细节。我现在明白为什么它会导致这个问题。我想我会放弃迂腐的警告。抱歉,我已经接受了另一个答案,但我赞成你所有的贡献来弥补它。
【解决方案2】:

你错过了typedef

typedef NS_ENUM(int, SomeEnumType){
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
};

您提到您使用的是迂腐警告。编译器是正确的:固定类型的枚举是part of the C++ standard,而不是 ISO C。

【讨论】:

  • 嗯,谢谢你的建议。我想我要么将clang diagnostic push 作为其有效的objective-c 将其删除,要么只是关闭迂腐警告。我不知道我是否足够铁杆来跟上它。
【解决方案3】:

正如其他人指出的那样,迂腐警告是正确的。但是,您不必使用 NS_ENUM 宏来利用严格类型的枚举。只要像这样声明你的枚举,警告就会消失,而你保持严格的输入:

typedef enum : int {
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
} SomeEnumType;

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多