gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:47:56 24 4
gpt4 key购买 nike

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

‘>>’应该是嵌套模板参数列表中的‘>>’

但如果我像在这段代码中那样使用 #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;
}

最佳答案

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

这意味着,对于宏,vi 的扩展给出了一个 > 标记,与宏调用之后的标记分开。在每种情况下,标记化只能找到单个 > 字符,因此这就是生成的标记。

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

关于c++ - C++ 中#define 宏扩展的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28559265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com