gpt4 book ai didi

c - 如何使用可变参数宏附加到数组?

转载 作者:行者123 更新时间:2023-12-04 15:23:47 27 4
gpt4 key购买 nike

我试图通过使用宏来消除一堆样板代码。

这是有效的。我可以替换:

int do_register_script(struct context *L)
{
method_type const _instance_methods[] = {
{"new", __new},
{"delete", __delete}
{NULL, NULL}
};
register_type(L, script, _instance_methods, 0);
return 1;
}

用宏

#define do_register_type(name) \
int do_register_ ## name(struct context *L) \
{ \
method_type const _instance_methods[] = { \
{"new", __new}, \
{"delete", __delete}, \
{NULL, NULL} \
}; \
register_type(L, name, _instance_methods, 0); \
return 1; \
}

像这样:

do_register_type(script);

完美!

但我也有一些看起来像这样的:

int do_register_rectangle(struct context *L)
{
method_type const _instance_methods[] = {
{"new", __new},
{"delete", __delete},
{"area", area},
{"perimeter", perimeter}
{NULL, NULL}
};
register_type(L, rectangle, _instance_methods, 0);
return 1;
}

现在上面的宏不起作用。

如何向宏添加另一个参数以支持此操作?

我使用的是 C,而不是 C++,所以没有模板。

更新:有时代码中的名称使用别名

        {"area", area},
{"Area", area},
{"perimeter", perimeter}
{"Perimeter", perimeter}

最佳答案

你想要那个吗:

#define do_register_type(name, ...) \
int do_register_ ## name(struct context *L) \
{ \
method_type const _instance_methods[] = { \
{"new", __new}, \
{"delete", __delete}, \
__VA_ARGS__ __VA_OPT__(,) \
{NULL, NULL} \
}; \
register_type(L, name, _instance_methods, 0); \
return 1; \
}

do_register_type(script);

do_register_type(script, {"area", area}, {"perimeter", perimeter});

之前的代码在 m.c 中:

pi@raspberrypi:~ $ gcc -E m.c
# 1 "m.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "m.c"
# 14 "m.c"
int do_register_script(struct context *L) { method_type const _instance_methods[] = { {"new", __new}, {"delete", __delete}, {NULL, NULL} }; register_type(L, script, _instance_methods, 0); return 1; };

int do_register_script(struct context *L) { method_type const _instance_methods[] = { {"new", __new}, {"delete", __delete}, {"area", area}, {"perimeter", perimeter} , {NULL, NULL} }; register_type(L, script, _instance_methods, 0); return 1; };
pi@raspberrypi:~ $

我注意到您不希望areaperimeter 使用前缀“__”,与newdelete 相反em> 但在某些其他情况下您可能需要它,因为它不可能自动扩展,我看到的唯一方法是明确给出要添加的代码

关于c - 如何使用可变参数宏附加到数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62731240/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com