![](/img/trans.png)
[英]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.