我正在使用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来纠正它,但它仍然发出警告。
我打开了迂腐的编译器警告。这只是一个过于迂腐的情况,还是有一种错误的正确方法?
答案 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;