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

jac*_*ash 3 c iphone enums objective-c compiler-warnings

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

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

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

@interface Issue : NSObject
....
Run Code Online (Sandbox Code Playgroud)

我得到编译器警告:

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

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

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

@interface Issue : NSObject
....
Run Code Online (Sandbox Code Playgroud)

在代码中完全相同的位置,问题就消失了.我对NS_ENUM做错了什么?

编辑:

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

我打开了迂腐的编译器警告.这只是一个过于迂腐或者是否存在错误的正确方法的情况?

WDU*_*DUK 6

尝试:

typedef NS_ENUM(int, SomeEnumType){
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
};
Run Code Online (Sandbox Code Playgroud)

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

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

#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
Run Code Online (Sandbox Code Playgroud)

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

enum _name : _type _name;
Run Code Online (Sandbox Code Playgroud)

这是在宏本身内执行前向声明.因此,随着迂腐的警告,它正在标志着这种使用.

迂腐警告只是说明你是否想要将其转换为纯C,它不会是可移植的,因为它不遵循枚举的前向声明的标准化.在Xcode,Clang和LLVM(以及由Apple提供的NS_ENUM这一事实)的范围内,你应该非常安全.


小智 5

你错过了typedef:

typedef NS_ENUM(int, SomeEnumType){
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
};
Run Code Online (Sandbox Code Playgroud)

你提到你正在使用迂腐警告.编译器是正确的:固定类型的枚举是C++标准的一部分,而不是ISO C.