9

これを例に挙げると、

int a = 100;
int b = a;

int main(int argc, char **argv, char ** env)
{
  printf("The value of b=%d\r\n",b);

  return 0;
}

これで、期待どおりにコンパイル エラーが発生しました。

[joshis1@localhost global_var]$ gcc global_var.c -o global_var.out
global_var.c:4:1: error: initializer element is not constant
 int b = a;
 ^

ここで知りたいのは、なぜエラーが発生するのかということです。コンパイラがこの操作を制限する理由。初期化されたグローバル変数がデータ セグメントに格納されることを理解しています。コンパイラは最初に a の値を解決し、次に同じ値を b に割り当てることができます。なぜこの機能がないのですか?コンパイラが行うのは複雑ですか? この機能の背後にある根拠はありますか、それとも C の落とし穴ですか?

4

4 に答える 4

1

C は、非常に単純で小型のマシンに移植できます。定数ではない式を評価するには、関数内にランタイム コードが必要です。組み込みプログラミングでは、明示的にプログラムしていない関数 (またはコード) が必要ない場合があります。

異なるオプションで構成されている場合、コンパイラはおそらく初期化子を言語拡張として評価します。それが失敗した場合は、C++ (C のようなサブセットであっても) または他の好きなことを行う別の言語を試すことができます :v) 。

于 2013-10-02T05:11:55.190 に答える
0

他の人は、イニシャライザが一般に任意の式であることを許可できない理由を述べています。

コンパイラにコードを強制的に受け入れる」方法は、コードを変更することです。ファイル スコープの任意の初期化、外部リンケージ (俗語: "global") 変数を実行する標準的な方法は、必要なシーケンスですべての初期化を行う main() の開始時に初期化関数を呼び出すことです。

#include <stdio.h>
int a;
int b;

void init(void)
{
     a = 100;
     b = a;
}

int main(int argc, char **argv)
{
     init();
     printf("The value of b=%d\n", b);

     return 0;
}
于 2013-10-02T12:04:09.557 に答える