Типовые безопасные универсальные контейнеры с макросами

Я пытаюсь сделать типобезопасный общий связанный список в 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 */ 

Ответы на вопрос(6)

Ваш ответ на вопрос