【发布时间】:2015-02-17 10:00:08
【问题描述】:
我知道如果我们在变量声明中关闭尖括号后不加空格,C++ 会抛出以下错误。
‘>>’ should be ‘> >’ within a nested template argument list
但是如果我在这段代码中使用#define,则不会出现错误。有人可以解释一下吗?
我认为#define只是一个宏扩展,作用类似于find-replace,所以这里声明变量的方式应该是一样的。
如果我用 C++11 编译它也不会发生这个错误。
#include <bits/stdc++.h>
using namespace std;
#define vi vector<int>
int main(){
//Doesn't work, compile error
vector<vector<int>> v;
//Works
vector<vi> vv;
}
【问题讨论】:
-
在 C++11 中,
>>通过一个特殊规则变得有效,因为空间要求太烦人了。 -
如果你对文件运行
cpp,你可以看到两个>字符之间添加了一个空格。 -
@MSalters 这不是误导,而是诊断。当集成的预处理器将标记直接提供给翻译阶段 7 时,空白没有明确表示。但是当被要求生成文本输出时,预处理器必须在必要时插入空格以保留标记边界。现代预处理器仅在必要时才会这样做。因此,当您在文本预处理器输出中看到原始文本中不存在的空白时,您可以得出结论,有一些规则要求其两侧的内容保持不同的标记。
-
@Jignesh 这是一个 g++ 实现细节。不能保证它仍然存在或将来会做同样的事情,并且没有其他编译器拥有它。
-
@Jignesh 例如,如果我尝试使用 clang 而不是 g++ 编译您的测试程序,我会收到一条错误消息,
test.cc:1:10: fatal error: 'bits/stdc++.h' file not found。
标签: c++