100

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

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

savedXcodeは、それが未使用の変数であると報告しますが、もちろんそうではありません。これはNSAssert1マクロだからだと思います。NS_BLOCK_ASSERTIONSマクロが定義されていないため、ObjectiveCアサーションは確実に有効になっています。

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

4

10 に答える 10

110

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

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

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

BOOL saved = NO;
saved = [moc save:&error];
于 2011-03-27T18:06:14.167 に答える
108

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

BOOL saved __unused;
于 2012-05-14T06:40:47.700 に答える
37

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

これがスクリーンショットです:ビルド設定のスクリーンショット

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

于 2011-03-27T19:35:29.480 に答える
22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

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

于 2012-08-21T01:28:02.940 に答える
16

変数を使用済みとしてマークするための唯一の簡単でポータブルな方法は…それを使用することです。

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

ただし、すでに説明したコンパイラ固有の拡張機能には満足しているかもしれません。

于 2014-02-19T08:10:28.560 に答える
15
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

ソース

于 2017-08-04T13:58:39.917 に答える
8

試してみてください:__unused属性。Xcode5で動作します

于 2014-02-28T15:09:13.623 に答える
6

これは、Cで、したがってObjective-Cで行う方法です。

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

(void)[moc save:&error];

編集:コンパイラはへのキャストを無視するvoidので、パフォーマンスに影響を与えるべきではありません-それはただのすてきな人間の注釈です。

于 2017-03-30T11:55:38.727 に答える
5

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

于 2014-06-11T15:53:56.800 に答える
1

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

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
于 2016-06-22T20:38:00.510 に答える