4

次のコードは正常にコンパイルされるようです。

typedef struct Test {
  int i;
  int j;
} Test;

int main() {
  int i;
  i = 0;
  Test p = {i, 1};
  printf("%d\n", p.i);
  return 0;
}

スプリントが失敗する

example2.c:9:7: Parse Error. (For help on parse errors, see splint -help
           parseerrors.

(これがラインですTest p = {i, 1};

これは違法な C ですか、それともスプリントのバグですか?

( p を にしたいのでやりたいのですconstが、修飾子を外しても失敗するようconstです。 の宣言と初期化iを1行にすれば、問題も解消されそうです。)

4

2 に答える 2

2

これはautomatic 変数であるため、C99 以降は有効です。ただし、グローバル変数とstatic変数には使用できません。gcc では、拡張機能として C99 より前のバージョンでもこれが許可されています (autoもちろん、まだこれだけです)。

以前の標準とは微妙な違いがいくつかあり、C99 には C++ の行コメント_Boolなどの多くの便利な機能が導入されているため、通常は少なくとも C99 互換のコンパイラを使用することをお勧めします。

注:pは実行時および関数が呼び出されるたびに初期化されます (main通常は 1 回だけ呼び出されますが、ここでも規則が適用されます)。あなたがそれを作るかどうかは関係ありませconstん。一般に、const変数 (sic!) についてはstatic、実行時のオーバーヘッドを節約するために変数またはグローバルも使用することをお勧めします。OTOH、これ(上記を参照)は変数初期化子を許可しません。

于 2015-07-11T18:11:41.337 に答える
1

このような初期化子は C99 の機能です。私はスプリントを知りませんが、スプリントのマニュアルは 2003 年のままです。これは、スプリントが C99 を話さない可能性が高いことを意味します。

于 2015-07-11T18:11:56.620 に答える