Xcodeで「未使用の変数」の警告を取り除くにはどうすればよいですか?


98

未使用の変数警告が発生する理由を正確に理解しています。それらはほとんどの場合信じられないほど役立つので、私はそれらを一般的に抑制したくありません。ただし、次の(考案された)コードを検討してください。

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);

Xcode savedは、使用されていない変数であることを報告しますが、もちろんそうではありません。これはNSAssert1マクロだからだと思います。NS_BLOCK_ASSERTIONSマクロがされていないのObjective Cのアサーションは間違いなく有効になっているので、定義されました。

何も害はありませんが、乱雑で煩わしいので、抑制したいのですが、どうすればよいかわかりません。変数をそれ自体に割り当てると、コンパイラの警告は表示されなくなりますが、そのようなことが存在する場合は、「正しい」方法で行う方がよいでしょう。

回答:


107

新しいLLVMコンパイラでまだサポートされているかどうかはわかりませんが、GCCには、その警告を抑制するために使用できる「未使用」の属性があります。

BOOL saved __attribute__((unused)) = [moc save:&error];

または(LLVMが上記をサポートしていない場合)、変数宣言を別の行に分割して、マクロが展開されるかどうかにかかわらず、変数が「使用される」ことを保証できます。

BOOL saved = NO;
saved = [moc save:&error];

107

Xcode 4.3.2を使用して、これが機能しているように見える(書き込みが少ない)

BOOL saved __unused;

これは私にとっては機能しません。警告が表示されます'saved' was marked as unused but was used
ヒースボーダーズ2016

37

Xcodeでは、「未使用の変数」の警告を設定できます。ターゲットの「ビルド設定」に移動し、「未使用」という単語でフィルタリングします

ここにスクリーンショットがあります: ビルド設定のスクリーンショット

デバッグ用にのみ変更することをお勧めします。そうすることで、リリースバージョンで何も見逃すことはありません。


37
グレゴリーが「ほとんどの場合非常に役立つので、私はそれらを一般的に抑制したくない」と言った質問の一部を見逃しましたか?
Sherm Pendley、2011年

8
@ShermPendleyとにかく、これはまだ便利です、それをグローバルにオフにする方法に関する私の質問に答えました。
ラフィアン

9
警告をオフにすることは、バグを見逃す優れた方法です。私は強くお勧めしません。
orion elenzil 2013年

2
@orionelenzil-まあ、はい、いいえ。誤検知による実際のインターフェースの問題があります。変数を使用するコードの部分に達していない場合、コードの作成中に警告が常に表示されます。時間の経過とともに、これは警告を無視するように訓練し、より重要なエラーを見逃す可能性があります。アクティブに編集されているコードのブロックのエラーを抑制できる方がよいでしょう。
TechZen 2014年

こんにちは、NOに設定すると問題なく動作します。しかし、私の疑問は、私はデバッグとリリースを設定する必要があることです。どれを設定しなければならないか。Totally NOを設定すると、リリースna中に問題が発生しませんか?
SR Nayak 2014

22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

このようにしてみてください。それは私のために働いています。それもあなたのために働くでしょう。


これは私にとっては機能しません。警告が表示されます'saved' was marked as unused but was used
ヒースボーダーズ2016

15

変数を使用済みとしてマークする唯一の簡単で移植可能な方法は、それを使用することです。

BOOL saved = ...;
(void)saved; // now used

ただし、すでに説明したコンパイラ固有の拡張機能に満足している場合もあります。


2
私は、上記の醜い#pragmaよりもこれを好みます。
ノーザン

1
こんにちは、素敵なヒント
dimazava

13
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

ソース


これは、これらの
#pragmas


5

「リリース」で「いいえ」のLLVMコンパイラ2.0警告を設定できますここに画像の説明を入力してください


4

これはCで行う方法なので、Objective-Cでも同じです。

警告を有効にしていない場合でも、戻り値を明示的に無視するようにマークすることは常に良い考えです。また、他の開発者に、戻り値を忘れただけではなく、実際に無視することを明示的に選択したことも示しています。

(void)[moc save:&error];

編集:コンパイラはへのキャストを無視するためvoid、パフォーマンスに影響を与えることはありません。これは、人間の注釈にすぎません。


特定のコンテキストでは、このハックを使用してObjective-Cコードをコンパイルする必要があります。使用するの(void)が最もわかりやすい方法です。ありがとうございます。
Dan Rosenstark

1

2行かかるようにします。宣言とデフォルト値を分離する

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.