|
|
1
128
为什么这很重要?当宏被扫描并展开时,它会创建一个禁用上下文。此禁用上下文将导致引用当前正在扩展的宏的标记被涂成蓝色。因此,一旦将其绘制为蓝色,宏将不再展开。这就是宏不递归展开的原因。但是,禁用上下文仅在一次扫描期间存在,因此通过延迟扩展,我们可以防止宏被涂成蓝色。我们只需要对表达式应用更多扫描。我们可以用这个
接下来,我们定义一些用于执行某些逻辑(如if等)的运算符:
现在有了这些宏,我们可以编写递归
出于演示目的,我们将创建一个谓词,用于在参数数为1时进行检查:
接下来,我们创建一个操作符,我们将只包含两个令牌。我们还创建一个最终操作符(称为
|
|
|
2
10
|
|
|
3
9
您可以使用递归包含文件。不幸的是,循环的迭代次数不能超过预处理器允许的最大深度。 事实证明C++模板是图灵完整的,可以以类似的方式使用。退房 Generative Programming |
|
|
4
6
我使用元模板编程就是为了这个目的,一旦你掌握了窍门,它就会很有趣。在谨慎使用时非常有用。因为正如前面提到的,它的图灵完成,甚至可以导致编译器进入无限循环,或者堆栈溢出!没有什么比去喝杯咖啡更能让你发现你的编译占用了超过30 GB的内存和所有的CPU来编译你的无限循环代码! |
|
|
5
6
|
|
|
6
5
这里有一个滥用的规则,可以让它合法地完成。编写自己的C预处理器。让它以你想要的方式解释一些布拉格指令。 |
|
|
7
2
我发现,当编译器脾气暴躁,无法为我展开某些循环时,这个方案很有用
|
|
|
Timo · 如果宏变量后跟构成有效标识符的字符,则不会展开宏变量 8 年前 |
|
|
user3623498 · 在#if中更改变量时出现问题 8 年前 |
|
|
einpoklum · 来自#cmakedefine替换的意外结果 8 年前 |
|
|
Joseph Franciscus · C中预处理器方法的别名++ 8 年前 |
|
|
stoper · 防止同一宏在多个转换单元中具有不同的定义 8 年前 |
|
|
СеÑгей · MinGW中预处理器g++的奇怪行为 8 年前 |