web-dev-qa-db-ja.com

Xcodeで警告を抑制する方法はありますか?

Xcodeで警告を抑制する方法はありますか?

たとえば、文書化されていないメソッドを呼び出していますが、メソッドがヘッダーにないため、コンパイル時に警告が表示されます。私はそれをヘッダーに追加して警告を停止できることを知っていますが、ヘッダーに追加する以外の方法があるのではないかと思っています(そのため、ヘッダーをクリーンで標準に保つことができます)?プラグマか何か?

113
kdbdallas

Xcode 3およびllvm-gcc-4.2を使用して、ファイルごとに警告を無効にするには、次を使用できます。

#pragma GCC diagnostic ignored "-Wwarning-flag"

警告名はgcc警告フラグです。

これにより、コマンドラインの警告フラグが上書きされます。ただし、すべての警告が機能するわけではありません。 CFLAGSに-fdiagnostics-show-optionを追加すると、その警告を無効にするために使用できるフラグを確認できます。

141
robottobor

未使用の変数警告を抑制する簡単な方法があります:

#pragma unused(varname)

編集:ソース: http://www.cocoadev.com/index.pl?XCodePragmas

更新:新しいソリューション、より堅牢なソリューションに出会いました

  1. [プロジェクト]> [アクティブターゲットの編集]> [ビルド]タブを開きます。
  2. User-Defined:キーを見つけます(見つからない場合は作成します)キー:GCC_WARN_UNUSED_VARIABLENOに設定します。

EDIT-2の例:

BOOL ok = YES;
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

コンパイラは、okに対して未使用の変数警告を表示します。

解決:

BOOL ok = YES;
#pragma unused(ok)
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

PS:他の警告を設定/リセットすることもできます:GCC_WARN_ABOUT_RETURN_TYPEYES/NO

48
thesummersign

Gccには次を使用できます

#pragma GCC diagnostic Push
#pragma GCC diagnostic ignored "-Wshadow-ivar"
// your code
#pragma GCC diagnostic pop

GCCプラグマはこちら について学習し、警告の警告コードを取得するには、レポートナビゲーター(Command + 9)に移動し、最上位のビルドを選択し、ログを展開します(上の「=」ボタン右)、一番下までスクロールすると、警告コードがこのような角括弧内にあります[-Wshadow-ivar]

Clangには次を使用できます

#pragma clang diagnostic Push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop
33

個々のファイルの警告を抑制するには、次の手順を実行します。

xcodeプロジェクトでファイルを選択します。 [情報を取得]を押して、ビルドオプションを含むページに移動し、-Wno-と入力して警告を無効にします。

-いや-

例えば.

-Wno-unused-parameter

プロジェクトの設定を見ると、ビルドタブページの下部にあるGCC警告を見て、警告の名前を取得できます。各警告をクリックすると、警告パラメーター名が表示されます。

例えば.

関数パラメーターが宣言以外で使用されていない場合は常に警告します。 [GCC_WARN_UNUSED_PARAMETER、-Wunused-parameter]

26
Anders

警告を取り除くには:問題のオブジェクトのカテゴリインターフェイスを作成してみてください

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

-(void) myMethod {
...
   [theObject theUndocumentedMethod];
...
}

余談ですが、私は強く出荷コードで文書化されていないメソッドを呼び出さないようにアドバイスします。インターフェイスは変わる可能性があり、変わるでしょう。それはあなたのせいです。

5
Mark Pauley

http://nshipster.com/pragma/#inhibiting-warnings -警告の禁止セクションにスキップ

4
Austin France

Objective-Cでは、多くの重大なエラーが警告としてのみ表示されます。 never警告を無効にするだけでなく、通常は「警告をエラーとして扱う」(-Werror)をオンにします。

コード内のあらゆるタイプの警告は、物事を正しく行うことによって(通常はオブジェクトを正しいタイプにキャストすることによって)、または必要なときにプロトタイプを宣言することによって回避できます。

4
Matt Gallagher

「Undocumented.h」という新しい別個のヘッダーファイルを作成し、プロジェクトに追加します。次に、ドキュメント化されていない関数を呼び出すクラスごとに1つのインターフェイスブロックを作成し、それぞれに '(Undocumented)'のカテゴリを与えます。次に、その1つのヘッダーファイルをPCHに含めます。このようにして、元のヘッダーファイルはクリーンなままで、他に保持するファイルは1つだけです。PCHの1行をコメント化して、すべての警告を再度有効にすることができます。

また、このメソッドは、「(Depreciated)」カテゴリの「Depreciated.h」の減価償却関数にも使用します。

最良の部分は、個々のプロトタイプをコメント化またはコメント解除することにより、個々の警告を選択的に有効化/無効化できることです。

3
MarqueIV

その特定の警告を抑制することは安全ではありません。コンパイラーは、引数のタイプを認識し、メソッドに戻って正しいコードを生成する必要があります。

たとえば、次のようなメソッドを呼び出す場合

[foo doSomethingWithFloat:1.0];

これはフロートを受け取り、プロトタイプが表示されない場合、コンパイラはメソッドがフロートではなくダブルを受け取ると推測します。これにより、クラッシュが発生し、値が誤って解釈される可能性があります。上記の例では、Intelマシンのようなリトルエンディアンマシンでは、レシーバーメソッドは1ではなく0を渡します。

i386 ABI docs でその理由を読むか、警告を修正することができます。 :-)

1
Ken