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

Jig*_*esh 28 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;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 36

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

这意味着,使用宏,扩展会vi给出一个>令牌,与宏调用之后的令牌分开.在每种情况下,标记化仅查找单个>字符,因此这是生成的标记.

没有宏,"贪婪"的标记化规则意味着将两个连续的字符视为单个>>标记,直到C++ 11为此案例添加了特殊规则.

  • 要更清楚地看到这一点,请考虑`#define plusi + i`.你现在可以写`int i = 0; std :: cout << + plusi`.预测会发生什么,然后尝试. (8认同)
  • [本实验](http://pastebin.com/1MDWQZ73)显示预处理器非常聪明.当使用`cpp`预处理代码时,它确实产生了包含该空间的`vector <vector <int >>>`.在其他情况下,它不包括空间. (7认同)
  • @MSalters OTOH,任何将其投入生产的人都需要被解雇 (2认同)