簡體   English   中英

NS_ENUM提供有關前向引用的編譯器警告

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM