C宏扩展为多个函数调用

Gle*_*eno 5 c macros c-preprocessor

是否可以编写预处理器宏,以便将可变数量的参数转换为连续的函数调用,例如

MAP(f, 1, 2, 3, ..., n)
Run Code Online (Sandbox Code Playgroud)

f(1); f(2); f(3); ... f(n);
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有以下,这似乎工作:

#define MAP(f, t, ...) \
{\
    t __varlist[] = {__VA_ARGS__};\
    for(int i = 0; i < sizeof(__varlist) / sizeof(t); i++)\
        f(__varlist[i]);\
}
Run Code Online (Sandbox Code Playgroud)

请注意,此宏采用类型参数,以便它可以更有用.

有没有办法在不宣布临时的情况下做到这一点?或者这没关系,因为编译器非常聪明,它可以找出所有内容?我是C的新手.

ugo*_*ren 1

在 gcc 中,您可以避免使用以下类型typeof

#define MAP(f, a1, ...) \
{\
    typeof(a1) __varlist[] = {a1, __VA_ARGS__};\
    for(int i = 0; i < sizeof(__varlist) / sizeof(t); i++)\
        f(__varlist[i]);\
}
Run Code Online (Sandbox Code Playgroud)

在没有临时的情况下执行此操作,即如果有 N 个参数,则真正构建 N 个调用是可能的,但相当复杂,并且将限制在某个最大值(要支持最多 N 个,您需要定义 N 个宏)。
为此,您需要一个宏来计算其参数(搜索此站点),并使用该数字加上串联来选择 N 个宏之一(例如MAP1(f, a)MAP2(f, a, b)等等)。