8

コード:

  GValue value = { 0 };

次の警告を与えます。

不足している初期化子 [-Wmissing-field-initializers]

私はそれがgcc's BUG;であることを知っています。しかし、それを削除するためのトリックはありますか?そのような非現実的な警告を見るのは本当に良くありません。しかし、実際の警告も私から隠されるため、警告の電源をオフにしたくありません。申し訳ありませんが、gcc を 4.7 (修正されたようです) バージョンに更新することはまだできません。

4

3 に答える 3

11

あなたが使用することができます:

-Wno-missing-field-initializers

その警告を具体的に禁止します。逆に、次の場合にエラーになる可能性があります。

-Werror=missing-field-initializers

これらは両方ともGCC4.7.1で動作します。これらはGCC4.6.xでも動作すると思いますが、以前のすべてのバージョンのGCCでは動作しません(GCC 4.1.2は認識しますが、動作し-Wno-missing-field-initializersません-Werror=missing-field-intializers)。

明らかに、警告を抑制するもう1つの方法は、すべてのフィールドを明示的に初期化することです。しかし、それは苦痛になる可能性があります。

于 2012-11-14T06:38:19.897 に答える
9

-sG_VALUE_INITの初期化に使用します。GValueそれらの (プライベート) 構造は、適切に/usr/include/glib-2.0/gobject/gvalue.hどのようになってい#define G_VALUE_INITます。

それが GCC のバグであるというあなたの評価には強く反対します。フィールドが明示的に初期化されていない場合に警告するように要求すると-Wmissing-field-initializers、それに値する警告が表示されます。

残念ながらG_VALUE_INIT文書化されていませんが、ここにあります。コード

GValue value = G_VALUE_INIT;

要求された場合に、フィールドの初期化が欠落しているという警告が表示されないようにする普遍的な解決策はありません-Wmissing-field-initializers。このような警告を要求するときは、不完全なイニシャライザをすべて警告するようコンパイラに要求します。実際、標準では、明示的に初期化されていないすべてのstructフィールドをゼロにする必要がありgcc、標準に従います。

次のような診断プラグマを使用できます

#pragma GCC diagnostic ignored "-Wmissing-field-initializers"

しかし、私の感覚では、慎重にコーディングし、すべてのフィールドを明示的に初期化する必要があります。表示される警告は、バグの警告というよりもコーディング スタイルの警告 (フィールドを忘れた可能性があります) です。

また、初期化を意図している場合は、独自の(パブリック)マクロを初期化structする必要があると思います。#definestruct

于 2012-11-14T06:19:24.630 に答える
1

次のような初期化の .field-style を使用しているようにも見えます。

GValue value = { .somefield = 0 };

コンパイラが警告を発行しないようにします。残念ながら、構造体が不透明な場合、これは非スターターです。

于 2014-12-13T16:28:35.233 に答える