5

私は C ソース コードなので、構造体のすべての要素が適切に初期化されるようにしたいと考えています。警告 Wmissing-field-initializers を使えば簡単です。しかし、指定された初期化子を使用して要素を初期化できるようにしたいと考えています。

例えば:

struct s {
  int a;
  int b;
};

struct s s1 = { .a = 1, .b = 2 };
struct s s2 = { .a = 1 };
struct s s3 = { 1, 2 };
struct s s4 = { 1 };

これをコンパイルしてみましょう:

$ gcc -Wmissing-field-initializers -c struct_init.c 
struct_init.c:9:8: warning: missing initializer
struct_init.c:9:8: warning: (near initialization for ‘s4.b’)

s2の初期化でもコンパイルが失敗することを望みます。ソースコードの読み取りが容易になるため、指定された初期化を好みます。

4

2 に答える 2

4

指定初期化子を使用すると、欠落しているメンバーが に初期化され0ます。これは、オブジェクトに自動保存期間がある場合でも当てはまります。私の知る限り、指定初期化子を使用するときに明示的に初期化されていないgccメンバーについて警告できるオプションはありません。

于 2013-01-02T13:38:11.003 に答える
2

-Werror を使用して警告をエラーにするか、 -Werror=missing-field-initializers を使用してフィールド初期化子の警告のみをエラーにすることができます。

詳細はこちら: GCC 警告オプション

編集:追加オプションなしでスプリントを使用してテストを実行したところ、次の出力が得られました。

main.c:13:17: Initializer block for s2 has 1 field, but struct s has 2 fields:
             <error>
  Initializer does not set every field in the structure. (Use -fullinitblock to
  inhibit warning)
main.c:15:17: Initializer block for s4 has 1 field, but struct s has 2 fields:
             1

ソースに対してこれを手動で実行する必要があるため、正確に求めているものではないかもしれませんが、指定されたイニシャライザがないことを警告します。

于 2013-01-02T13:45:34.167 に答える