2011-01-27 11 views
2
#define PR (A, B) cout << (A) << (B) << endl ; 

- エラー - > Aはスコープ
で宣言されていなかった - エラー - > Bは、スコープ
で宣言されていなかった - エラー - >期待される "" "裁判所未満" の前にC++には空き領域がありますか?

I C++はスペースフリーな言語だと思っていましたが、上記のコードを書くとエラーが発生します。 私はまだ「私のコンソールが正しく動作していないのかライブラリですか?」と考えています。

私が間違っていない場合は、どうすればいいですか「C++はスペースフリーの言語です」

+0

空白はすべての有用な言語で重要です。他に誰が言っているのですか? –

+0

最初にC++が「スペースフリー言語」のアイデアはどこにありましたか? – fredoverflow

+0

@FredOverflow、私は3つの本を読んだ、それらのすべては同じことを言う。より具体的な本の名前を付けることができます。考えているのはC++ –

答えて

10

空白が問題となる場所は数多くあります。これはその一つです。 PRの後のスペースで、プリプロセッサは(A,B)がマクロ展開の一部であるかどうかを知るはずです。それは、PRが見えるところでは、それは(A, B) cout << (A) << (B) << endl ;を置き換えるべきであると単純に仮定します。

空白事項別の場所には例えば、ネストされたテンプレート引数である:

std::vector<std::vector<int> > 

最終スペースが必須であること、そうでない場合、コンパイラはそれが>>オペレータの前提としています。 (これはC++ 0xでソートされているとは思うが)。

さらに別の例である:

a + +b; 

2つの+シンボル間のスペースは、明白な理由のために、必須です。

+2

はい、 '>>'の問題は実際にはC++ 0xでソートされています。テンプレート定義の場合は – fredoverflow

+0

+1。何度もそれを見てきました。 – Sulla

6

macro-function-nameと引数リストを開始するかっこの間にスペースを入れることはできません。

#define PR(A, B) cout << (A) << (B) << endl 

改行の形の空白は、プリプロセッサが改行に当たったときに#defineステートメントが終了するため、重要です。

マクロ関数定義の最後にセミコロンを入れるのは悪い考えですが、以下のセミコロンなしで使用すると混乱します。

1

#defineはC++ではありません。プリプロセッサです。 C++の規則は、プリプロセッサの規則と同じではありません。

マクロを指定するには、名前とかっこの間にスペースを入れないでください。

#define PR(A, B) cout << (A) << (B) << endl; 
0

あなたは誰の声を聞いたことがないのですか?

プリプロセッサステージは、後のレキシングステージなどと同じルールに従いません。 >テンプレートを閉じる、改行で区切られたコメント、文字列リテラルは、実際の改行(それらのエスケープシーケンスとは異なる)を埋め込むことはできません。

ロットは、Pythonとは異なり、インデントや行区切りの自由度がさまざまです。

0

"C++空間"の一部ではなく、プリプロセッサ(コンパイラの一部)への命令として、C++プリプロセッサを考えることができます。したがって、2つの 'スペース '..