[英]Compiler gives warning on performSelectorOnMainThread:@selector(delegateMethod)
[英]NS_ENUM gives compiler warning about forward references
我使用spiffy new NS_ENUM尝试在我的objective-c iOS项目中定义一个枚举。
我在类的标题中声明了NS_ENUM,如下所示:
NS_ENUM(int, SomeEnumType){
SomeEnumType1,
SomeEnumType2,
SomeEnumType3,
SomeEnumType4
};
@interface Issue : NSObject
....
我得到编译器警告:
ISO C禁止前向引用“枚举”类型
现在,如果我定义enum(稍微)旧的传统方式,如下所示:
typedef enum{
SomeEnumType1,
SomeEnumType2,
SomeEnumType3,
SomeEnumType4
}SomeEnumType;
@interface Issue : NSObject
....
在代码中完全相同的位置,问题就消失了。 我对NS_ENUM做错了什么?
编辑:
我通过添加typedef来纠正它,但它仍然发出警告。
我打开了迂腐的编译器警告。 这只是一个过于迂腐的情况,还是有一种错误的正确方法?
尝试:
typedef NS_ENUM(int, SomeEnumType){
SomeEnumType1,
SomeEnumType2,
SomeEnumType3,
SomeEnumType4
};
NS_ENUM
不会为你声明SomeEnumType
类型做typedef,你必须自己做。
更新:出现警告的原因是由于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这一事实)的范围内,你应该非常安全。
你错过了typedef
:
typedef NS_ENUM(int, SomeEnumType){
SomeEnumType1,
SomeEnumType2,
SomeEnumType3,
SomeEnumType4
};
你提到你正在使用迂腐警告。 编译器是正确的:固定类型的枚举是C ++标准的一部分 ,而不是ISO C.
正如其他人所指出的那样,迂腐警告是正确的。 但是,您不必使用NS_ENUM
宏来利用严格类型的枚举。 只需声明这样的枚举,当您保留严格的输入时警告就会消失:
typedef enum : int {
SomeEnumType1,
SomeEnumType2,
SomeEnumType3,
SomeEnumType4
} SomeEnumType;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.