2017-08-05 8 views
-1

でI iはXは静的変数に割り当てられたローカル変数ている一つのプログラムを試み、それが値を割り当てているか否かをチェック。ローカル静的変数に割り当てられた変数、「C」でコンパイルエラーが、成功は、C++ここ

私は「C」プログラムをした:(初期化子要素が一定でない)、それはコンパイル時のエラーを与えることは明らかでした。

は、その後、私はC++同じプログラムを実装:この時間私は時間エラーをコンパイル取得できませんでしたが、「等しい」として出力する(それは以前のように、コンパイル時エラーを与えることになっていませんでした)。

これを説明してください。

int main() //C code 
{ 
    int x=10; 
    static int i=x; 
    if(i==x) 
     printf("Equal"); 
    return 1; 
} 


int main() //C++ code 
{ 
    int x=10; 
    static int i=x; 
    if(i==x) 
     cout<<"equal"; 
    return 0; 
} 
+5

CとC++は異なる言語であるためです。 –

答えて

7

C++とは異なり、Cでは静的初期化子を定数にする必要があります。これはC++でコンパイルされませんが、Cでコンパイルされます:あなたのプログラムに特別な初期化コードを挿入し、C++は関数の外mainstaticの変数を入力する前に実行するため

int makeInitialValue() { 
    return 42; 
} 
static int val = makeInitialValue(); 

これは、またはのための機能に入る前にローカル統計。 Cはそれをしません。すべてのstatic初期化子がコンパイル時定数である必要があります。

参照:

C99規格、6.7.8

一定でなければならない静的記憶域期間を持つオブジェクトの初期化子で
  • すべての式式または文字列リテラル。
  • C++ 11標準、3.6.2

    一緒に、ゼロ初期化および定数初期化静的初期呼ばれます。他のすべての初期化は動的初期化です。静的ストレージ 持続時間を持つ非ローカル変数の動的初期化がmainの最初の文の前に行われるかどうかは、実装によって定義されます。

    +0

    私は、関連する部分は、関数内の 'static'変数が、C++で初めて関数が呼び出されたときに初期化されるということです。 Cは、プログラムの開始前にそれらを初期化します。 – melpomene

    +0

    はい。 C++開発者を混乱させる狡猾な計画 - 静的c'torのバグは、メインの第一行に到達していないことを意味する可能性があります:) –

    +0

    あなた、ありがとう –

    関連する問題