#在C++中定义宏扩展的行为

Behaviour of #define macro expansion in C++

本文关键字:扩展 定义 C++      更新时间:2023-10-16

我知道,如果我们不在变量声明中的右尖括号后面放空格,C++会抛出以下错误。

‘>>’ should be ‘> >’ within a nested template argument list

但是如果我像在这段代码中那样使用#define,就不会出现错误。有人能给我解释一下吗?

我认为#define只是一个宏扩展,它的工作原理类似于find-replacement,所以这里声明变量的两种方式应该是相同的。

此外,如果我用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;
}

标记化后进行宏扩展;它不替换文本,而是替换标记序列。

这意味着,对于宏,vi的扩展将提供一个>令牌,与宏调用后的令牌不同。在每种情况下,标记化只找到一个>字符,因此这就是生成的标记。

在没有宏的情况下,"贪婪"标记化规则意味着两个连续字符被视为单个>>标记,直到C++11为这种情况添加了一个特殊规则。