7

というクラスがありましたConstants。その中にはこれがありましたtypedef

typedef enum visible_thing {

    BACKGROUND,
    BACKGROUND_COLOR,
    MAIN_WINDOW

} VISIBLE_THING;

そして私の人生はバラ色でした!この型にアクセスする必要がある場所ならどこでも「Constants.h」をインポートしていましたが、すべて機能しました。

それから私はConstantsクラスを核攻撃することにしました。私は typedef を取り、それを別のクラスに入れました。わかりやすくするために、それを と呼びましょうOtherClassConstants.hのすべてのインポートを のインポートに変更しましたOtherClass.h。これですべてです。他のコードには触れていません。そして今、すべてが壊れた!

完全に機能するメソッドは、次のConstantsエラーを表示します: Parse Issue - Expected a type. 一体何?誰かがこれについて何らかの手がかりを持っていることを願っています!

更新: イライラすることに、これは説明なしに自然に解決したように見える問題の 1 つです。以下の私自身の質問に、1 つのファイルで同じヘッダーを複数回 #import する必要があることを発見した回避策で回答しました。しかし、今日、余分な #import を削除しましたが、すべてが機能していました。引数。コンピューター!

4

4 に答える 4

8

同じ「Expected a type」が表示されましたが、インポート ループが原因であることがわかりました。次の簡単な例でそれを再現しました。

あ:

#import "B.h"

typedef enum {
    SomeEnumA
} SomeEnum;

@interface A : NSObject

@end

Bh:

#import "A.h"

@interface B : NSObject

- (void) func:(SomeEnum)arg;

@end

コンパイラは、Am (Ah をインポートするだけ) のコンパイル中に、Bh で不明な SomeEnum について不平を言います。これは、Ah が Ah をインポートする Bh をインポートするために発生します。インポート ループは発生しないため、この場合の Bh には、型が定義されている Ah コードが含まれていません。

この問題は、列挙型の定義を別の SomeEnum.h に移動することで簡単に解決できます。

于 2014-02-09T06:52:48.923 に答える
1

何が起こっているのかを突き止めようとするでしょう。なぜなら、これが起こる原因が将来、他の不思議なバグを引き起こす可能性があるからです。その時点までに、あなたはこれを忘れているかもしれません。将来のバグの。

私は問題を切り分けようとします。あなたが試すことができるいくつかのこと:

  • InnerClass インターフェイスのコードを徐々にコメントアウトして、問題を解決できるかどうかを確認してください。
  • ファイルの先頭に別の型名の typedef を手動で追加し (そして残りのコードを適切に編集して)、問題がまだ存在するかどうかを確認してください。
  • .h ファイルと OtherClass.h ファイルを投稿して、他の誰かが問題を見つけられるかどうかを確認します
  • 問題を再現できるかどうかを確認するためにデモ プロジェクトを作成するという David H の提案

それはあなたのプロジェクトが何であるかにもよると思います.それが小さくて速く動作したいだけであれば、おそらく問題ではありませんが、それがより大きなプロジェクトになり、コードベースの拡大が予測される場合、または他のコーダーも同様に取り組んでいるものです。ここで何が起こっているのかを理解しようとします。

于 2012-09-10T13:38:22.720 に答える
0

エラーを生成していたクラスには、内部でのみ使用されるヘルパー クラスという 2 つの他のクラス定義が含まれていました。どうやらそれが問題の根源だったようです。

私が知らなかったのは、ファイルに複数のクラスがある場合、同じヘッダーを複数回インポートする必要がある場合があるということです。

これを修正するために私がしたことは次のとおりです。私はこれを変更しました:

#import "OtherClass.h"

@interface InnerClass

// uses typedef from OtherClass

@end



@interface MainClass

// uses typedef from OtherClass

@end

これに:

#import "OtherClass.h"

@interface InnerClass

// uses typedef from OtherClass

@end

#import "OtherClass.h" //<--without this, MainClass won't recognize the typedef 

@interface MainClass

// uses typedef from OtherClass

@end

これは不格好で、何か他のことを間違っているように見えますが、少なくとも目前の問題は修正されました。フォローアップのコメントをお待ちしております。

于 2012-09-09T17:06:42.040 に答える