NS_ENUM提供有关前向引用的编译器警告

时间:2013-01-28 11:23:25

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

我正在使用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来纠正它,但它仍然发出警告。

我打开了迂腐的编译器警告。这只是一个过于迂腐的情况,还是有一种错误的正确方法?

3 个答案:

答案 0 :(得分:6)

尝试:

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领域(以及由Apple提供的NS_ENUM),您应该非常安全。

答案 1 :(得分:5)

你错过了typedef

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

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

答案 2 :(得分:3)

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

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