1. ホーム
  2. c

[解決済み] C言語では、配列のイニシャライザーリストに非恒等式を使用できますか?

2022-02-14 06:26:19

質問

以下のコードで a で初期化されます。 s これは明らかに定数式ではありません("実行時に評価されるからです)。

#include <stdio.h>

int main(void)
{
    int s = 1, i;
    int a[] = {s, s + 2, s + 4, s + 6, s + 8};

    for (i = 0; i < (int) (sizeof a / sizeof a[0]); i++)
        printf("%d ", a[i]); /* prints: 1 3 5 7 9  */
    putchar('\n');

    return 0;
}

でコンパイルされます。 gcc -Wall -Wextra を警告なしで表示します。しかし -pedantic を誘発する。

check.c: In function ‘main’:
check.c:8: warning: initializer element is not computable at load time
check.c:8: warning: initializer element is not computable at load time
check.c:8: warning: initializer element is not computable at load time
check.c:8: warning: initializer element is not computable at load time
check.c:8: warning: initializer element is not computable at load time

C言語では、イニシャライザ要素に定数式が必要ですか?

どのように解決するのですか?

c99では有効ですが、c89では無効です(強調)。

<ブロッククオート

(C89, 6.5.7) "静的記憶期間を持つオブジェクトのイニシャライザに含まれる全ての式 または、集約または和集合を持つオブジェクトのイニシャライザリストに含まれる。 型は定数式でなければならない。

しかし

(C99, 6.7.8p4) "静的記憶期間を持つオブジェクトのイニシャライザの式は、すべて定数式または文字列リテラルでなければなりません。

デフォルトでは gcc でコンパイルします。 -std=gnu89 これは、c89 + GNU 拡張です。