3

おしゃれな新しい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 を追加して修正しましたが、それでも警告が表示されます。

私はペダンティックなコンパイラ警告をオンにしました。これはあまりにも衒学的なケースですか、それとも間違っている正しい方法がありますか?

4

3 に答える 3

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の領域内(およびNS_ENUMがAppleによって提供されているという事実)では、かなり安全であるはずです。

于 2013-01-28T11:34:53.867 に答える
5

あなたは逃したtypedef:

typedef NS_ENUM(int, SomeEnumType){
    SomeEnumType1,
    SomeEnumType2,
    SomeEnumType3,
    SomeEnumType4
};

衒学的な警告を使用していると述べました。コンパイラは正しいです。固定型の列挙型は、ISO C ではなく、C++ 標準の一部です。

于 2013-01-28T11:33:36.150 に答える