使用来自类似函数的C宏的动态名称在C宏中定义函数

c9x0cxw0  于 2023-01-20  发布在  其他
关注(0)|答案(2)|浏览(119)

好吧,这听起来很奇怪,标题有点混乱,但我的意思基本上是:

#define make_name(id) cool_name_##id
#define my_cool_macro(id, type) void fun_##make_name(id)(type arg1)

my_cool_macro(hello, char);

这方面应扩大到

/*
 * passed through my_cool_macro
 *                 vvvvv
 */
void fun_cool_name_hello(char arg1);
/*   ~~~~^^^^^^^^^^^^^^^ */
  • 一月一日-一月一日
  • x1米2米1x--x1米3米1x

我没有更好的方法来解释这件事,有没有办法让这件事成功?
基本上:

  • 定义一个类似函数的宏,它可以生成名称
  • 定义另一个类似于函数的宏,该宏使用传递给函数创建者宏的参数调用定义的名称创建宏

我为什么要这么做

我有点想用宏在c中实现templaces,正如你所知道的,模板函数可以有不同的类型,我想修改名称,但不重复cool_name_...,因为如果我想将cool_name更改为some_name该怎么办
该解决方案工作方式也应该与我的示例类似,因此fun_##make_name(hello)应该与hello_##make_name(hello)ewuihewuifh_##make_name(hello)一样工作,而不需要为每个更改定义宏

ovfsdjhp

ovfsdjhp1#

您可以:

#include <stdio.h>

#define join(x, y)  x##y
#define make_name_l(fn, id, arg_type) fn##id(arg_type)
#define make_name(fn, id, arg_type) make_name_l(fn, id, arg_type)
#define my_cool_macro(ret_type, id, arg_type) ret_type make_name(join (fun_, cool_name_), id, arg_type)

my_cool_macro(void, hello, char);

int main (void) {
    fun_cool_name_hello('a');
    return 0;
}
void fun_cool_name_hello (char a) {
    printf ("In function : %s, arg : %c\n", __func__, a);
}
    • 其他:**

如果你想让它处理任何类型或数量的参数,你可以使用省略号(...)和__VA_ARGS__

include <stdio.h>

#define join(x, y)  x##y
#define make_name_l(fn, id, ...) fn##id(__VA_ARGS__)
#define make_name(fn, id, ...) make_name_l(fn, id, __VA_ARGS__)
#define my_cool_macro(ret_type, id, ...) ret_type make_name(join (fun_, cool_name_), id, __VA_ARGS__)

my_cool_macro(void, hello, char);
my_cool_macro(int, multiple_args, char, int, const char *);
my_cool_macro(void, no_args, void);

int main (void) {
        const char * str = "test";
        fun_cool_name_hello('a');
        fun_cool_name_multiple_args('x', 5, str);
        fun_cool_name_no_args();
        return 0;
}
void fun_cool_name_hello (char a) {
        printf ("In function : %s, arg : %c\n", __func__, a);
}

int fun_cool_name_multiple_args (char c, int i, const char * pstr) {
        printf ("In function : %s, c : %c, i : %d, str : %s\n", __func__, c, i, pstr);
        return i;
}

void fun_cool_name_no_args (void) {
        printf ("In function : %s\n", __func__);
}

输出:

# ./a.out
In function : fun_cool_name_hello, arg : a
In function : fun_cool_name_multiple_args, c : x, i : 5, str : test
In function : fun_cool_name_no_args

https://godbolt.org/z/d67MWjasz

mrfwxfqh

mrfwxfqh2#

您可以使用一个宏来创建原型及其类型,以及一个用于生成自定义名称的宏。

#define name(f) cool_name_##f
#define make_function(type, name, arg) type fun_name(arg)
#include <stdio.h>

#define name(f) cool_name_##f
#define make_function(type, name, arg) type fun_name(arg)

make_function(void, name(hello), int);

void cool_name_fun_hello(int f) {
    printf("%d\n", f);
}

int main(void) {
    cool_name_fun_hello(1);
}

相关问题