我知道如果我们在变量声明中关闭尖括号后不放空格,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;
}
Run Code Online (Sandbox Code Playgroud)
Mik*_*our 36
标记化后发生宏扩展; 它不会替换文本,而是替换令牌序列.
这意味着,使用宏,扩展会vi给出一个>令牌,与宏调用之后的令牌分开.在每种情况下,标记化仅查找单个>字符,因此这是生成的标记.
没有宏,"贪婪"的标记化规则意味着将两个连续的字符视为单个>>标记,直到C++ 11为此案例添加了特殊规则.