1

原則として、関数の外部で定義された変数(つまり、グローバル変数、名前空間変数、およびクラス静的変数)は、main()が呼び出される前に初期化されます。翻訳ユニット内のこのような非ローカル変数は、宣言順に初期化されます

上記は私の講師によるクラスノートの行です。

#include <iostream>

using namespace std;
int a=99;
int b;
int main(int argc, char *argv[]) 
{
  cout<<a<<endl;
  cout<<b<<endl;
  return 0;
}
b=100;

これを実行しているときにエラーが発生しました。main()が呼び出される前に「b」が100に割り当てられているというのは本当ではありませんか?C++ requires a type specifier for all declarations

4

5 に答える 5

5

ここでの問題は初期化の順序ではありません。b実際、main実行を開始する前に初期化されます。

問題はの「可視性」ですbmainコンパイルされている時点では、はありませんb

bの定義/初期化を前に移動することで修正できますmain

#include <iostream>

using namespace std;
int a = 99;
int b = 100;
int main (int argc, char *argv[]) {
    cout << a << '\n';
    cout << b << '\n';
    return 0;
}

または単にそれbが存在することを示します:

#include <iostream>

using namespace std;
int a = 99;
extern int b;
int main (int argc, char *argv[]) {
    cout << a << '\n';
    cout << b << '\n';
    return 0;
}
int b = 100;

これらの2つのソリューションはどちらも、b実行時に作成または初期化されたときに変更されることはなく、単にb内で利用可能になりますmain

于 2012-08-07T08:56:18.980 に答える
3

あなたの講師は間違っています。グローバル変数は、宣言ではなく、定義順に初期化されます。

例えば、

#include <iostream>
struct S { S(const char *s) { std::cout << s << '\n'; } };
extern S a;    // declaration
extern S b;    // declaration
int main() { }
S b("b");      // definition
S a("a");      // definition

印刷します

b
a

投稿したコードは、使用時に宣言さbれていないため、機能しません。C ++(Cなど)は元々ワンパスコンパイラとして設計されていたため、宣言(たとえば)が必要です。extern int b

于 2012-08-07T08:56:40.047 に答える
2

注意して読みなさい。

関数(B)の外部で定義された変数は、mainが呼び出される(コンパイルされない)前に初期化されます。

正しくコンパイルするには、Bを最初に使用する前に定義(および宣言)する必要があります(これはエラーです。Bはどこでも宣言される前に使用されます)。

于 2012-08-07T08:52:49.583 に答える
2

問題はここにあります:cout<<b<<endl;

宣言する前に変数にアクセスすることはできません。

于 2012-08-07T08:50:45.217 に答える
0

問題はステートメントb=100;です。グローバルスコープにステートメントを配置することはできません(変数の初期化を除く)。

この行がそのままの場合、b宣言/定義、または内部または場所での使用にb関係なく、コードはコンパイルされませんmain

この行がないと、初期化されていないグローバル変数が0に初期化されるため(または行を任意の関数スコープに移動できるため)、コードは正しく機能し、b値はに等しくなります。0b=100;

于 2021-07-13T11:47:29.210 に答える