#define PR ( A, B ) cout << ( A ) << ( B ) << endl ;
- 错误 - &gt; A未在范围中声明 - 错误 - &gt; B未在范围中声明 - 错误 - &gt;预期“,”在“cout”之前
我认为C ++是无空间的语言,但是当我在上面写代码时,我看到了一些错误。 我仍然在想“我的控制台是不是正常工作还是库?”。
如果我没有错,怎么会有人说“C ++是一种无空间语言”?
答案 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 ++空间”的一部分。因此,虽然许多引用在两个空间之间共享,但规则确实不同” ..