1. ホーム
  2. C言語

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