3

我使用漂亮的新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 来纠正它,但它仍然给出警告。

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

4

3 回答 3

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 领域(事实上 NS_ENUM 是由 Apple 提供的),你应该很安全。

于 2013-01-28T11:34:53.867 回答
5

你错过了typedef

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

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

于 2013-01-28T11:33:36.150 回答
3

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

typedef enum : int {
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
} SomeEnumType;
于 2013-06-26T19:44:59.983 回答