c ++是一种无空间语言吗?

时间:2011-01-27 10:03:46

标签: c++ macros c-preprocessor whitespace

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

- 错误 - &gt; A未在范围中声明    - 错误 - &gt; B未在范围中声明    - 错误 - &gt;预期“,”在“cout”之前

我认为C ++是无空间的语言,但是当我在上面写代码时,我看到了一些错误。 我仍然在想“我的控制台是不是正常工作还是库?”。

如果我没有错,怎么会有人说“C ++是一种无空间语言”

5 个答案:

答案 0 :(得分:10)

空白很重要的例外情况很多;这是其中之一。使用PR之后的空格,预处理器如何知道(A,B)是否是宏扩展或其参数的一部分?它不会,并且只是假设它看到PR的任何地方,它应该替换( A, B ) cout << ( A ) << ( B ) << endl ;

空白重要的另一个地方是嵌套模板参数,例如:

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

最后一个空格是必需的,否则编译器会认为它是>>运算符。 (虽然我相信这是在C ++ 0x中整理出来的。)

又一个例子是:

a + +b;

由于显而易见的原因,两个+符号之间的空格是强制性的。

答案 1 :(得分:6)

宏函数名和从参数列表开始的括号之间不能有空格。

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

换行符形式的空格也很重要,因为#define语句在预处理器到达换行符时结束。

请注意,将分号放在宏函数定义的末尾通常是一个坏主意,这使得它们在下面没有分号的情况下使用会让人感到困惑。

答案 2 :(得分:1)

#define不是c ++,它是预处理器。 c ++的规则与预处理器的规则不同。

要表示宏,您的名称和括号之间不能有空格。

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

答案 3 :(得分:0)

你要求辩护我从来没有听过任何人费心的声音......?

预处理器阶段不遵循与后来的lexing等阶段相同的规则。还有其他的怪癖:>结束模板之间的空格需要,换行符分隔的注释,字符串文字不能嵌入实际的换行符(与它们的转义序列不同),字符内的空格和字符串文字会影响它们....

仍然有一个很多自由缩进和以不同方式对代码进行行分隔,与Python不同。

答案 4 :(得分:0)

您可以将c ++预处理器视为预处理器(编译器的一部分)的指令而不是“c ++空间”的一部分。因此,虽然许多引用在两个空间之间共享,但规则确实不同” ..