![]() |
1
9
不,因为预处理器只对文件进行一次“刷”。没有办法让它递归地定义宏。 我看到的唯一一个这样做的代码是 不 变量,但使用了用户必须传递的默认值:
假设所有值都是非负的。
内联函数至少应该为C++提供相同的函数。如您所述,最好将其留给具有类似于
|
![]() |
2
35
可以编写一个宏,该宏的计算结果为它调用的参数数。(我找不到指向我第一次看到它的地方的链接。)这样您就可以编写max_of_n(),它可以按您的意愿工作,但是您仍然需要所有编号的宏,直到达到某个限制:
现在
请注意,基本情况(
|
![]() |
3
10
您可能会认为这种欺骗,因为它不是递归的,也不在预处理器中工作。它使用gcc扩展。它只适用于一种类型。但是,它是一个变量max_n宏:
哦,是的,因为初始化列表中的变量表达式,我认为不等价于此(使用它自己的函数来避免STD::Max元素)将在C89中工作。但我也不确定可变宏是否在c89中。 我认为这里有一些东西可以绕过“只有一种类型”的限制。不过有点毛茸茸的:
|
![]() |
4
6
我认为,即使您可以递归地扩展宏,您的方法在效率方面也会有一个小问题…当宏展开时,如果
这是一个愚蠢愚蠢的答案,也许没有人会喜欢xd。 文件“source.c”
文件“makefile”
文件“make_macros.py”
然后定义这些漂亮的宏:
最棒的是…它工作^ ^ ^ |
![]() |
5
5
如果你在C++中沿着这条路走下去,看看 template metaprogramming . 它不漂亮,可能无法解决您的确切问题,但它将处理递归。 |
![]() |
6
4
首先,宏不会重复展开。尽管如此,宏可以通过为每个递归级别创建宏,然后推导递归级别来实现重入。然而,所有这些重复和推导递归,都由 Boost.Preprocessor 图书馆。因此,可以使用高阶折叠宏计算最大值:
现在,这将理解0-256之间的文字数字。它不适用于C++变量或表达式,因为C预处理器不理解C++。它只是纯文本替换。但是C++提供了一个称为“函数”的特性,它将用于C++表达式,并且可以使用它来计算最大值。
现在,上面的代码确实需要一个C++ 11编译器。如果使用C++ 03,则可以创建函数的多个重载,以便模拟参数。此外,我们可以使用预处理器为我们生成这种重复的代码(这就是它的作用)。所以在C++ 03中,你可以这样写:
|
![]() |
Timo · 如果宏变量后跟构成有效标识符的字符,则不会展开宏变量 6 年前 |
![]() |
user3623498 · 在#if中更改变量时出现问题 6 年前 |
![]() |
einpoklum · 来自#cmakedefine替换的意外结果 7 年前 |
![]() |
Joseph Franciscus · C中预处理器方法的别名++ 7 年前 |
![]() |
stoper · 防止同一宏在多个转换单元中具有不同的定义 7 年前 |
![]() |
СеÑгей · MinGW中预处理器g++的奇怪行为 7 年前 |