gpt4 book ai didi

c - 是否可以动态定义 _Generic 的关联列表?

转载 作者:行者123 更新时间:2023-12-04 10:30:08 25 4
gpt4 key购买 nike

我有一个这样的模板:

template.h
----------
// Declare a function "func_type()"
void JOIN(func_, T)(T t) { return; }
#undef T

我这样使用它是为了为不同类型生成相同的函数:
example.c
---------
#define T int
#include "template.h"

#define T float
#include "template.h"

我想要一个 func我可以用它代替 funct_int , func_float等。我的问题 _Generic似乎不可能动态定义关联列表。实际上,我想要这样的东西:
#define func(TYPE) _Generic((TYPE), AUTO_GENERATED_LIST)

而不是像这样手动定义每个新类型:
#define func(TYPE) _Generic((TYPE), int: func_int..., float: func_float...)

这是一个不起作用的代码示例: https://ideone.com/HN7sst

最佳答案

我认为你想要做的事情可以用可怕的“X 宏”来实现。创建一个列表,例如

#define SUPPORTED_TYPES(X) \
X(int, "%d") \
X(float, "%f") \

哪里 int是类型,在这种情况下,我使用 printf 格式说明符作为另一项。这些可以是任何算作有效预处理器 token 的东西。

然后你可以通过这样的邪恶宏生成所有函数:
#define DEFINE_F(type, fmt) \
void f_##type (type param) \
{ printf(fmt "\n", param); }

SUPPORTED_TYPES(DEFINE_F)

这将创建诸如 void f_int (int param) { printf("%d\n", param); } 之类的函数.也就是说,与 C++ 模板非常相似——函数做同样的事情但类型不同。

然后,您可以像这样编写 _Generic 宏:
void dummy (void* param){}
#define GENERIC_LIST(type, fmt) type: f_##type,
#define func(x) _Generic((x), SUPPORTED_TYPES(GENERIC_LIST) default: dummy)(x)

在这里定义通用 asoc。列出 GENERIC_LIST ,使用 type项目,但忽略其他一切。所以它扩展为例如 int: f_int, .

一个问题是旧的“尾随逗号”问题,我们不能像 _Generic((x), int: f_int,)(x) 这样写 _Generic f_int 后面的逗号会弄乱语法。我用 default 解决了这个问题子句调用了一个虚拟函数,不理想...可能想要粘贴一个 assert在那个函数里面。

完整示例:
#include <stdio.h>

#define SUPPORTED_TYPES(X) \
X(int, "%d") \
X(float, "%f") \


#define DEFINE_F(type, fmt) \
void f_##type (type param) \
{ printf(fmt "\n", param); }

SUPPORTED_TYPES(DEFINE_F)


void dummy (void* param){}
#define GENERIC_LIST(type, fmt) type: f_##type,
#define func(x) _Generic((x), SUPPORTED_TYPES(GENERIC_LIST) default: dummy)(x)

int main (void)
{
int a = 1;
float b = 2.0f;
func(a);
func(b);
}

输出:
1
2.000000

这是 100% ISO C,没有扩展。

关于c - 是否可以动态定义 _Generic 的关联列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60453659/

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