我想寫一些C可重用的通用型安全的代碼,使用宏,類似於如何klib作品:簡單定義多行C宏的技巧?
#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編輯器支持(智能感知),所以我想知道是否有任何技巧可以讓我(可能)添加一些定義,然後包括文件,而不必結束每行\
?
喜歡的東西:
// 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
,我會以某種方式得到了所有正確的struct
S和功能。問題是這些宏中有很多參數串聯,所以我不確定這是否可以以比第一個片段更簡單的方式完成?
我估計這是可能的,我已經看到了這種宏觀魔法。但是,您聲明(改述)您希望減少以「\」結尾的行數,並且我理解這是對可讀性的(值得稱讚的)期望。我也認爲會有副作用,例如需要使用「#undef」。 (我有一個使用undef的迷信是邪惡的,即容易出現用法錯誤。)我估計宏觀魔法不會使事情更具可讀性,相反。 – Yunnosch