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来纠正它,但它仍然发出警告.
我打开了迂腐的编译器警告.这只是一个过于迂腐或者是否存在错误的正确方法的情况?
尝试:
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.