#在C++中定义宏扩展的行为
Behaviour of #define macro expansion in C++
我知道,如果我们不在变量声明中的右尖括号后面放空格,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为这种情况添加了一个特殊规则。
相关文章:
- 如何使用IExecuteCommand和动词在上下文菜单外壳扩展中显示本地化文本和自定义图标?
- 通过cMake使用具有自定义文件扩展名的共享库
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 扩展自定义类型的spdlog
- 扩展string_view是未定义的行为吗
- 在内联命名空间中扩展最初在内联命名空间的封闭命名空间中定义的命名空间
- 如何在C++中定义扩展到条件语句的宏?
- 从函数为 std::vector 创建自定义扩展
- 尝试使用 Cython 扩展时未定义的符号
- 使用子类中的类型定义扩展模板类
- 将代码移出类定义时未扩展参数包
- 强迫QT MOC扩展一些自定义宏
- 在使用Qt Designer Form Classes扩展我自己的自定义小部件时防止重复的自动连接
- 预处理器,在未定义时将宏扩展为无
- 未使用模板类型定义的同时参数包扩展错误
- 如何使用boost ::与扩展STL容器的自定义容器分配
- 如何使用静态变量,使用自定义Getter和设置器在SWIG中扩展结构
- 用户定义的C 文件扩展名,用于G 汇编
- C++ 扩展模板类时定义特定对象类型
- 构建php扩展时未定义的引用