是否可以在 C 的编译时处理可变参数宏中的每个元素?
Is it possible to handle each element in a variadic macro at compile time in C?
是否有可能以某种方式实现以下目标?我正在使用 gcc。
#define foo(argCount, ...)\
FOR_EACH_IN_VA_ARGS_(argCount, element, __VA_ARGS__)\
{\
printf("%u", sizeof(element));\
}
感谢您的回答。
如果 argCount 是一个常量,它可以被模仿,否则,您将需要支持一些现代标准。
这个答案展示了如何在预处理器中执行 foreach 宏:https://whosebug.com/a/51775003/1084774
应用于您的示例,不需要 argCount
参数并且有状态版本实际上是不可能的,因为预处理器没有定义和未定义之外的可变状态,但是你可以有一个 apply-macro-to-each 版本:
#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 header)
一个更简单的方法是通过 macro-argument-parametrized 列表宏:
#include <stdio.h>
#define PRSZ(X) printf("%zu\n", sizeof(X));
#define LIST(_) _(char) _(short) _(int) _(long) _(long long)
int main(void)
{
LIST(PRSZ)
}
这两种方法都是可移植的。
是否有可能以某种方式实现以下目标?我正在使用 gcc。
#define foo(argCount, ...)\
FOR_EACH_IN_VA_ARGS_(argCount, element, __VA_ARGS__)\
{\
printf("%u", sizeof(element));\
}
感谢您的回答。
如果 argCount 是一个常量,它可以被模仿,否则,您将需要支持一些现代标准。
这个答案展示了如何在预处理器中执行 foreach 宏:https://whosebug.com/a/51775003/1084774
应用于您的示例,不需要 argCount
参数并且有状态版本实际上是不可能的,因为预处理器没有定义和未定义之外的可变状态,但是你可以有一个 apply-macro-to-each 版本:
#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 header)
一个更简单的方法是通过 macro-argument-parametrized 列表宏:
#include <stdio.h>
#define PRSZ(X) printf("%zu\n", sizeof(X));
#define LIST(_) _(char) _(short) _(int) _(long) _(long long)
int main(void)
{
LIST(PRSZ)
}
这两种方法都是可移植的。