Cコンパイルエラー: ファイルスコープで '***' が可変に変更されました。
2022-02-23 09:24:33
C コンパイルエラー: ファイルスコープで '***' が可変に変更されました。
エラーの理由
配列の宣言に読み取り専用の型が使用されています。
このエラーの原因は、次のようなコードが使用されていることです。
const int length = 256;
char buffer[length] = {0};
C言語では、constは真の定数ではなく、読み取り専用の値のみを表します。const で宣言されたオブジェクトは、実行時のオブジェクトであり、量の初期値、配列の長さ、格の値、型格の値として使用することはできない。例えば
//commented with an error message
const int length = 256;
char buzzer[length]; //error: variably modified 'buffer' at file scope
int i = length; //error: initializer element is not constant
switch (x) {
case length: //error: case label does not reduce to an integer constant
/* code */
break;
break; default:
break;
break; default: break; }
解決方法
読み出し専用のconst型ではなく、マクロ定義の#defineを使用する。
// Resolve the error reported
#define LENGTH 256
char buzzer[LENGTH]; //error: variably modified 'buffer' at file scope
int i = LENGTH; //error: initializer element is not constant
switch (x) {
case length: //error: case label does not reduce to an integer constant
/* code */
break;
break; default:
break;
defineとconstの違い
constで変更された型は、メモリ上にスペースを取りますが、#defineはスペースを取りません。#define は、コンパイル前に、コンパイルするソースファイルの対応する部分を文字列に置き換えるだけです。
char buzzer[256];
int i = 256;
switch (x) {
case 256:
/* code */
break;
default:
break;
詳細なリファレンス https://blog.csdn.net/mad_sword/article/details/79809263
関連
-
エラー LNK2005: _main は first.obj で既に定義されています。
-
Cプログラムの単純なエラー [エラー] ldは1終了ステータスを返した
-
デバッグエラー MSB3073: :VCEnd がコード Solution で終了した
-
エラーが発生しました。#79: 型指定子が必要です
-
struct と typedef struct を徹底的に理解する
-
c 言語エラー警告: 複数文字文字定数
-
Linuxプログラムにおけるセグメンテーションフォールト(コアダンプ)の一般的な解決方法
-
C C++プログラムのランタイムプログラムは、書き込みエラーのためにDebug/1.exeを開くことができません。
-
0xffffffとは何ですか?
-
警告: 非推奨の文字列定数から 'char *' への変換[-Write-strings] 解決法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
undefinedMakefile:***セパレータがありません。
-
すでに#.objで定義されているものを修正する。
-
複数形使用時:'**'の前にイニシャライザを置く解決策を期待。
-
エラーが発生しました。#852: 式は完全なオブジェクト型へのポインタでなければならない
-
free(): 次のサイズが無効 (fast): 0x0000000000aa4430 問題あり
-
libstdc++-6.dll が見つからないため、コードの実行を継続できません。プログラムを再インストールすると、この問題が解決する場合があります。
-
Cコンパイル警告:代入がキャストなしで整数からポインタを作成する
-
変数、配列、構造体におけるC言語の代入
-
Cエラー:構造体でも組合でもないものにメンバ 'xxx' を要求しています。