読者です 読者をやめる 読者になる 読者になる

C99の配列初期化が気になる場合

c

C99の配列初期化に潜む罠 | monoの開発ブログ


GCCだと "-Woverride-init"オプションをつけることで、重複した初期化が
ある場合警告してくれます.

#include <stdio.h>

int data[] = {
  [3] = 3,
  [2] = 2,
  [1] = 1,
  [0] = 0,
  0,
};

int main (void)
{
  for (int i = 0; i < sizeof(data) / sizeof(int); i++) {
    printf("data[%d]=%d\n", i, data[i]);
  }
  return 0;
}


上記のようなプログラムを何のオプションもなしにコンパイルすると、
警告されることはありませんが、-Woverride-initオプションをつけると警告を
されます。

% gcc -std=c99 test.c
# 何も警告されない
% gcc -std=c99 -Woverride-init test.c
test.c:8:3: error: initialized field overwritten [-Werror=override-init]
test.c:8:3: error: (near initialization for 'data[1]') [-Werror=override-init]


"-Woverride-init"は "-Wextra"オプションで onになりますので、"-Wall", "-Wextra"と
常にしておけば気づくことができると思います。警告を無視しがちな人は -Werrorも一緒に
つけてエラー扱いとするようにすればよいでしょう.


ちなみに clangだと何のオプションもなしで警告してくれるようです(3.2, 3.4で確認)

% clang test.c 
test.c:8:3: warning: initializer overrides prior initialization of this subobject
      [-Winitializer-overrides]
  0,
  ^
test.c:6:9: note: previous initialization is here
  [1] = 1,
        ^
1 warning generated.


組み込み機器向けのコンパイラだと同様の機能があるか不明ですが、
探してみて損はないと思いますので、ドキュメントなりをあたってみると
よいかもしれません。