1

メソッドまたはwinmainの外部でこのコードを使用する場合:

ostringstream vertexid;
vertexid << "bob";

vertexid << " ";
vertexid << " ";

vertexid << 48348093490;

あらゆる種類の構文エラーが発生します。スコープはこれにどのように影響しますか?なぜこれが起こっているのですか?

4

3 に答える 3

2

あなたはこのようなことをすることができます:

std::ostringstream ss;

#define nil(x) ((x), 0)
int x = nil(ss << "Hello");
int y = nil(ss << ", World!");
int z = nil(ss << std::endl);

変数名を考えるのが本当に嫌なら、もっとクレイジーなことをすることができます。

#define nilPASTE(x, y) x ## y
#define nilPASTE2(x, y) nilPASTE(x, y)
#define nil2(x) static int nilPASTE2(line_, __LINE__) = nil(x)
nil2(ss << "Goodbye");
nil2(ss << ", Sun!");
nil2(ss << std::endl);

あなたは尋ねました:

スコープはこれにどのように影響しますか?なぜこれが起こっているのですか?

スコープについて言及していると思います。それは、エラーメッセージが表示されるためです。しかし、その質問の両方の部分に対する答えは、C++コンパイラがC++言語の規則に従っていることです。これにより、ステートメントをどこにでも表示することはできません。それらは、関数とメソッド本体にある、許可されている場所にのみ表示されます。私のテクニックが許可されている理由は、私が表現を使用しているためであり、表現はより多くの場所に表示される可能性があります。特に、変数の初期化子に表示することができます。そしてもちろん、変数宣言は変換ユニットの最も外側のレベルで許可されます。

そのすべてのゴブリーグックは、関数とメソッド内にステートメントを配置することを意味します。

于 2012-06-19T08:15:12.880 に答える
1

グローバルスコープでのみ宣言または定義できます。

最初の行だけで問題ありません(実装ファイルでは...ヘッダーに複数の定義があるリスクがあり、定義する代わりに宣言する必要があるextern場合)、次の行は正しくありません。

于 2012-06-19T07:59:01.783 に答える
-2

グローバル名前空間では、いつ実行する必要があるので、コードを持つことはできません。実行可能ステートメントは、関数内にのみ配置できます(例:WinMain/ ) main

実行はWinMain/で始まりmain、そこから他の関数​​を呼び出すことができます。

于 2012-06-19T08:05:04.293 に答える