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

Я пытаюсь создать типобезопасный общий связанный список на 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 */ 
5
задан Paul Manta 22 February 2012 в 19:55
поделиться