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


119

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

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


はい、ときどき未使用の変数について警告しないようにコンパイラに言わなければならないことがあります(彼によると)が、実際には次のように使用している可能性がありますBOOL ok = [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&d interval:NULL forDate:self]; NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);
thesummersign

回答:


145

ファイルごとに警告を無効にするには、Xcode 3とllvm-gcc-4.2を使用して、次のコマンドを使用できます。

#pragma GCC diagnostic ignored "-Wwarning-flag"

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

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


よろしくお願いします!まさに私が必要とするもの!
Moszi、2011年

28
警告コードを取得する簡単な方法:ログナビゲーター(Command + 7)に移動し、一番上のビルドを選択し、ログを展開し(右側の「=」ボタン)、一番下までスクロールします。
Neal Ehardt、2012年

1
気にする人のために、GCC警告オプションの教育用リファレンス:gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Levi

2
#pragma GCC diagnostic ignored "-Wwarning-flag"すでに削除されているようです
アレンリンリ

1
@allenlinliはまだそこにあります。gcc.gnu.orgwarning-flag
onlinedocs / gcc /

49

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

#pragma unused(varname)

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

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

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

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_TYPE::YES/NO


31
さらに簡単なのは、変数宣言の前に__unusedを置くことです。
マークレナード

@ mark-leonardは別の答えであるはずでした、私はこれを何日も探していました。必死になってコメントを読み始めました。ありがとうございました。
休息

35

あなたが使用できる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

4
Clangは、既存のソースコードとの互換性のためにGCCのプラグマをサポートしています。したがって、必要なのは、gcc形式のプラグマを作成することだけです。
アレン

1
Xcode 5.0以降、提供されているコンパイラはClangのみでした。したがって、今はclang形式のプラグマを使用する必要があります。
アレンリンリ

27

個々のファイルの警告を抑制するには、次のようにします。

xcodeプロジェクトでファイルを選択します。get infoを押して、ビルドオプションのページに移動し、-Wno-と入力して警告を無効にします。

-いいえ-

例えば

-Wno-unused-parameter

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

例えば

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


2
これは...あなたはそれがトリガーコンパイラの警告がどう変更したくないコードベースから、あなたが含まれたコードのための優れたソリューションである
マーク・ビートン

素晴らしい方法のように思われますが、XCode 4でこれを行う方法のアイデア
Santthosh

2
XCodeの4のためにここに私の解決策が見つかりstackoverflow.com/questions/6057192/...
Santthosh

鉱山のような1つの問題だけで抑止警告が必要な場合:...m:45:69: Incompatible pointer types sending...ビルドの説明を開いてこの警告を見つけます:ファイル[-Wincompatible-pointer-types]名を変更して-Wno-incompatible-pointer-typesフラグとして.mファイルに追加しました...これ以上警告は表示されません... +10 if私はできました
ニコスカラリス

5

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

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


14
これは良い一般的なアドバイスですが、質問には答えません。すべての警告が重大または重大であるとは限りません。多くは非常に簡単です。なんらかの理由(レガシーコードベース、サードパーティによってリンクされることを意図したコード、上司の規定など)のために、サードパーティのライブラリを使用する必要があり、それを変更できないと仮定します。これらの場合、特定の些細な警告の抑制は非常に受け入れられます。
ポール・レガート

5

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

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

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

余談ですが、コードの出荷時にドキュメント化されていないメソッドを呼び出さないことを強くお勧めします。インターフェースは変化する可能性があり、変化します。それはあなたの責任です。


私もこれを行います。私は自分のカテゴリを「プライベート」と呼び、それを.mファイルの先頭に配置します...これは、ファイル内でのみ使用されるメソッドを転送宣言する方法として機能します。プライベートヘッダーファイルの方がより標準的であることに同意しますが、実際に完全に(プライベート)に含める必要があるものをファイル間で絶えずバウンスしなければならないのは面倒です。
Pat Niemeyer

したがって、何かを使用する前にメソッドを実装するという古いCのトリックを使用できることがわかります。次に、ファイルローカルメソッドを使用します。プライベートではないので、他のファイルがこのように定義したセレクターにメッセージを送信する可能性があると思います。
マークポーリー


3

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

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

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


1

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

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

[foo doSomethingWithFloat:1.0];

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

理由はi386 ABI docsで読むか、警告を修正するだけです。:-)


2
良いアドバイスですが、上記のように、実際には質問には答えません。
ポール・レガート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.