C ++中#define宏扩展的行为

时间:2015-02-17 10:00:08

标签: c++

我知道如果我们在变量声明中关闭尖括号后不放空格,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;
}

1 个答案:

答案 0 :(得分:36)

令牌化后发生宏扩展;它不会替换文本,而是替换标记序列。

这意味着,使用宏,vi的扩展会提供一个>标记,与宏调用之后的标记分开。在每种情况下,标记化只能找到一个>个字符,因此产生了令牌。

没有宏,&#34;贪心&#34;标记化规则意味着将两个连续字符视为单个>>标记,直到C ++ 11为此案例添加了特殊规则。