简单的问题,我无法在网上找到答案.在可变参数宏中,如何查找参数的数量?如果它有解决方案,我可以使用boost预处理器.
如果它有所不同,我试图转换可变数量的宏参数来增强预处理器序列,列表或数组以进行进一步的重新处理.
我想知道我们是否可以在C/C++中使用递归宏?如果是,请提供示例.
第二件事:为什么我无法执行以下代码?我在做什么错?是因为递归宏吗?
# define pr(n) ((n==1)? 1 : pr(n-1))
void main ()
{
int a=5;
cout<<"result: "<< pr(5) <<endl;
getch();
}
Run Code Online (Sandbox Code Playgroud) 我的猜测是这个问题的答案是否定的,但如果有办法的话会很棒.为了澄清,假设我有以下宏:
#define MY_VARIADIC_MACRO(X...) // Does some stuff here in the macro definition
Run Code Online (Sandbox Code Playgroud)
我想要做的是以某种方式对X的所有变量执行字符串化,然后将其传递给可变参数函数; 这里的关键字是之前的.我知道有没有办法真正从接入宏定义中的各个参数,但有没有办法字符串化所有参数,与可能类似于下面的东西?
#define MY_VARIADIC_MACRO(X...) some_variadic_function("some string", #X)
Run Code Online (Sandbox Code Playgroud) 创建可变参数宏的技巧是什么FOO(a1, a2, a3,..., an),它可以扩展到您选择的任何预选有界范围内的FOOn(a1, a2, a3,..., an)值n?也就是说,FOO(a)应该扩展FOO1(a),FOO(a, b, c)对FOO3(a, b, c)等,我知道有一个标准的把戏,但我似乎无法找到它.
请随意将此问题标记为副本,如果答案中还有其他问题,请将其关闭.我怀疑有,但我找不到它.
我在大学的一位导师建议使用宏来减少c99代码中的重复,就像这样.
#define foreach(a, b, c) for (int a = b; a < c; a++)
#define for_i foreach(i, 0, n)
#define for_j foreach(j, 0, n)
#define for_ij for_i for_j
Run Code Online (Sandbox Code Playgroud)
哪个可以这样使用:
for_ij { /*do stuff*/; }
for_i { /*do stuff*/; }
Run Code Online (Sandbox Code Playgroud)
另一位具有工业背景的导师不鼓励使用它,声称它在他的前雇主身上被视为一种反模式(但他不知道背后的原因).实际上,通过浏览大型项目的源代码,很少能够在简短的学术范例之外找到这些结构.
我的问题是:为什么这种结构在实践中很少使用?它在某种程度上是危险的吗?