gpt4 book ai didi

c - 有什么技巧可以更简单地定义多行 C 宏吗?

转载 作者:行者123 更新时间:2023-12-03 03:36:05 26 4
gpt4 key购买 nike

我正在尝试使用宏在 C 中编写一些可重用的通用类型安全代码,类似于klib作品:

#define Fifo_define(TYPE) \
\
typedef struct { \
TYPE *head; \
TYPE *tail; \
size_t capacity; \
} Fifo_##TYPE, *pFifo_##TYPE; \
\
inline Fifo_##TYPE * Fifo_##TYPE##_init(size_t capacity) { \
Fifo_##TYPE * fifo = calloc(1, sizeof(Fifo_##TYPE)); \
TYPE * data = calloc(capacity, sizeof(TYPE)); \
fifo->head = data; \
fifo->tail = data; \
fifo->capacity = capacity; \
}

// define macros

#define Fifo(TYPE) Fifo_##TYPE
#define Fifo_init(TYPE, capacity) Fifo_##TYPE_init(capacity)

然后我将它与任何类型参数一起使用:

Fifo_define(int32_t);
...
Fifo(int32_t) *myFifo = Fifo_init(int32_t, 100);

但是,编写此内容相当复杂且容易出错,没有 IDE 编辑器支持(IntelliSense),所以我想知道是否有任何技巧可以让我(也许)添加一些定义,然后包含该文件,而无需必须以 \ 结束每一行?

类似于:

// no idea how to do this, just checking if similar concept is possible

#define FIFO_TYPE int
#define FIFO_NAME Fifo_int

#include <generic-fifo.h>

#undef FIFO_NAME
#undef FIFO_TYPE

我会以某种方式获得所有正确的结构和函数。问题是这些宏中有很多参数串联,所以我不确定这是否可以用比第一个片段更简单的方式来完成?

最佳答案

在这种情况下并不真正推荐,但您可以使用X-macros做一些您想要实现的事情。 :

#define SUPPORTED_TYPES \
X(int) \
X(double) \
X(char)

#define X(TYPE) \
typedef struct { \
TYPE *head; \
TYPE *tail; \
size_t capacity; \
} Fifo_##TYPE, *pFifo_##TYPE;
SUPPORTED_TYPES
#undef X

#define X(TYPE) \
inline Fifo_##TYPE * Fifo_##TYPE##_init(size_t capacity) \
{ \
Fifo_##TYPE * fifo = calloc(1, sizeof(Fifo_##TYPE)); \
TYPE * data = calloc(capacity, sizeof(TYPE)); \
fifo->head = data; \
fifo->tail = data; \
fifo->capacity = capacity; \
}
SUPPORTED_TYPES
#undef X

但这并没有真正改善情况。它不再需要一个丑陋的 Fifo_define 宏,因此您可以将代码分成几个部分。但宏观困惑依然存在。

<小时/>

我会推荐一些完全不同的方法。两个建议:

  • 在运行时以经典的 C 方式处理类型通用的事物。使用回调。如果需要,可以使用枚举来跟踪所使用的类型。

  • C11 _Generic 允许各种类型安全技巧,并可用于逐步淘汰此类困惑的宏。 Example that implements "functors" 。宏本身保持最小化,并且键入了各种类型的不同实现。 (无论如何,当您进行类型泛型编程时,这通常就是您最终要做的事情。)

关于c - 有什么技巧可以更简单地定义多行 C 宏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43343912/

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