Типовые безопасные универсальные контейнеры с макросами
Я пытаюсь сделать типобезопасный общий связанный список в C, используя макросы. Он должен работать аналогично тому, как шаблоны работают в C ++. Например,
LIST(int) *list = LIST_CREATE(int);
Моя первая попытка была для#define LIST(TYPE)
(макрос, который я использовал выше), чтобы определитьstruct _List_##TYPE {...}
, Это, однако, не сработало, потому что структура будет переопределяться каждый раз, когда я объявляю новый список. Я решил проблему, выполнив это:
/* You would first have to use this macro, which will define
the `struct _List_##TYPE`... */
DEFINE_LIST(int);
int main(void)
{
/* ... And this macro would just be an alias for the struct, it
wouldn't actually define it. */
LIST(int) *list = LIST_CREATE(int);
return 0;
}
/* This is how the macros look like */
#define DEFINE_LIST(TYPE) \
struct _List_##TYPE \
{ \
... \
}
#define LIST(TYPE) \
struct _List_##TYPE
Но другая проблема заключается в том, что, когда у меня есть несколько файлов, которые используютDEFINE_LIST(int)
Например, и некоторые из них включают друг друга, тогда все равно будет несколько определений одной и той же структуры. Есть ли способ сделатьDEFINE_LIST
проверить, если структура уже была определена?
/* one.h */
DEFINE_LIST(int);
/* two.h */
#include "one.h"
DEFINE_LIST(int); /* Error: already defined in one.h */