[解決済み] 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 拡張です。
関連
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】sizeof float (3.0) vs (3.0f)
-
[解決済み] C: エラー: ';'トークンの前に ')' があると予想される
-
[解決済み] テスト
-
[解決済み] '{'トークンの前に期待される式
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生した
-
[解決済み】エラー:イニシャライザー要素がロード時に計算可能でない
-
[解決済み】式は変更可能なL値でなければならない
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】0LLや0x0ULの意味は何ですか?
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない