13

私はこのObjective-Cの構造を持っています:

NSRange range = NSMakeRange(i, MIN(a, b));

ここでabNSUIntegersです。

MIN()標準NSObjCRuntime.hヘッダーファイルで次のように定義されているマクロです。

#if !defined(MIN)
   #define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; })
#endif

コンパイル中に、LLVMコンパイラ4.1は、「GNUステートメント式拡張の使用」という警告を示す私の命令を強調表示します。

これは何を意味するのでしょうか?それは私のせいですか?はいの場合、どうすれば修正できますか?そうでない場合、コンパイラの警告を削除するにはどうすればよいですか?

4

4 に答える 4

11

-Wno-gnu遅い答えですが、コンパイラフラグを追加することで、このメッセージを回避できます。

(Xcode 5では、プロジェクトのビルド設定に-Wno-gnu移動し、「Apple LLVM 5.0 –カスタムコンパイラフラグ」セクションにある「その他のCフラグ」に追加することでこれを変更できると思います。)

于 2013-12-16T21:28:50.303 に答える
10

「ステートメント式」はGNUCコンパイラの拡張であり、ステートメントのグループを実行して、最後のステートメントの値を返すことができます。

x = ({
    statement1;
    statement2;
    statement3;
});

上記の例でxは、によって返される値がありますstatement3

これは、他の式に簡単にネストできるマルチステートメントマクロを作成できる便利な機能です。ただし、C規格では定義されていません。

于 2012-10-26T12:44:22.157 に答える
8

-Wno-gnuあまりにも多くの警告をシャットダウンする、を使用しないでください。代わりに、以下を使用してください。

-Wno-gnu-statement-expression
于 2018-08-27T15:57:10.520 に答える
2

ステートメント式が宣言されています。

プロジェクト設定を変更せずにプラグマコードを使用すると、警告を選択的に無視できます。

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wgnu"

NSRange range = NSMakeRange(i, MIN(a, b));

#pragma GCC diagnostic pop
于 2015-01-03T00:52:30.657 に答える