我知道如果我们在变量声明中关闭尖括号后不放空格,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;
}
答案 0 :(得分:36)
令牌化后发生宏扩展;它不会替换文本,而是替换标记序列。
这意味着,使用宏,vi
的扩展会提供一个>
标记,与宏调用之后的标记分开。在每种情况下,标记化只能找到一个>
个字符,因此产生了令牌。
没有宏,&#34;贪心&#34;标记化规则意味着将两个连续字符视为单个>>
标记,直到C ++ 11为此案例添加了特殊规则。