在C语言中,是否可以在编译时处理可变宏中的每个元素?

在C语言中,是否可以在编译时处理可变宏中的每个元素?,c,macros,variadic-macros,C,Macros,Variadic Macros,是否有可能以某种方式归档以下内容?我正在使用gcc #定义foo(argCount,…)\ 对于参数中的每个参数(参数计数、元素、参数)\ {\ printf(“%u”,sizeof(元素))\ } 感谢您的回答。如果argCount是一个常量,则可以对其进行模拟,否则,您将需要对某些当代标准的支持。此答案显示了如何在预处理器中执行foreach宏: 应用到您的示例中,不需要使用argCount参数,并且不可能使用有状态版本,因为预处理器在定义的和未定义的之外没有可变状态,但您可以对每个版本使

是否有可能以某种方式归档以下内容?我正在使用gcc

#定义foo(argCount,…)\
对于参数中的每个参数(参数计数、元素、参数)\
{\
printf(“%u”,sizeof(元素))\
}

感谢您的回答。

如果argCount是一个常量,则可以对其进行模拟,否则,您将需要对某些当代标准的支持。

此答案显示了如何在预处理器中执行foreach宏:

应用到您的示例中,不需要使用
argCount
参数,并且不可能使用有状态版本,因为预处理器在定义的和未定义的之外没有可变状态,但您可以对每个版本使用apply宏:

#include "foreach.h" //generated header implementing BX_foreachc
#include <stdio.h>
#define prsz(X) printf("%zu\n", sizeof(X))
#define foo(...) BX_foreach(;,prsz,__VA_ARGS__)

int main(void)
{
    foo(char,short,int,long, long long);
    //expands to  printf("%zu\n", sizeof(char)) ; printf("%zu\n", sizeof(short)) ; printf("%zu\n", sizeof(int)) ; printf("%zu\n", sizeof(long)) ; printf("%zu\n", sizeof(long long));

 }
#包括“foreach.h”//generated header实现BX_foreachc
#包括
#定义prsz(X)printf(“%zu\n”,sizeof(X))
#定义foo(…)BX_foreach(;,prsz,uu VA_ARGS_uu)
内部主(空)
{
foo(char、short、int、long、long-long);
//扩展到printf(“%zu\n”,sizeof(char));printf(“%zu\n”,sizeof(short));printf(“%zu\n”,sizeof(int));printf(“%zu\n”,sizeof(long));printf(“%zu\n”,sizeof(long));
}
(依赖于链接答案中发布的脚本生成的foreach.h头)

更简单的方法是通过宏参数参数化的列表宏:

#include <stdio.h>
#define PRSZ(X) printf("%zu\n", sizeof(X));
#define LIST(_) _(char) _(short) _(int) _(long) _(long long)
int main(void)
{
    LIST(PRSZ)
}
#包括
#定义PRSZ(X)printf(“%zu\n”,sizeof(X));
#定义列表(u)u(char)u(short)u(int)u(long)u(long)
内部主(空)
{
名单(PRSZ)
}

这两种方法都是可移植的。

是的,argCount是一个编译时常量。模仿会是什么样子?@DanielSchreiberMendes只是用了很长的if elif else链。你能再解释一下吗?我不知道用什么方法可以做到这一点。非常感谢,这就是我一直在寻找的东西。“BX”代表什么?@DanielSchreiberMendes我很快从我的软件包中取出了它,它的名称空间是BX/BX。我可以把它删除或者改名。啊,好的。是否可以将两个参数传递给PRSZ?@DanielSchreiberMendes否。您可以将第二个参数嵌入到PRSZ宏中,也可以将元组分组到Paranthese中,使它们仅为一个参数。Boost.Preprocessor可以做到这一点。直接使用或作为灵感使用。谢谢,非常有趣的资源!