Реализация шаблона, совместимая для указателя в c

#define MAX_SIZE 32
#define DECLEAR_RINGQUEUE(type) \
typedef struct RINGQUEUE_##type{ \
    type data[MAX_SIZE]; \
}RINGQUEUE_##type; \
...someMethod

DECLEAR_RINGQUEUE(structA)
DECLEAR_RINGQUEUE(int*)

символ '*' влияет на имя структуры, как я могу это исправить... любая доступная директива препроцессора? или я должен переопределить другое определение, как

#define DECLEAR_RINGQUEUE_ptr(type) \
typedef struct RINGQUEUE_##type{ \
    type* data[MAX_SIZE]; \
}RINGQUEUE_##type; \

1 ответ

Решение

Используя "голые" типы, я не думаю, что вы можете сделать это без дополнительного макроса, так как int а также * два отдельных токена.

Так что ваш отдельный макрос возможен, но я бы немного изменил int а также int*:

#define DECLEAR_RINGQUEUE_ptr(type) \
    typedef struct RINGQUEUE_ptr_##type{ \
        type *data[MAX_SIZE]; \
    } RINGQUEUE_ptr_##type;

Как у вас сейчас есть, оба будут создавать одинаковые struct а также typedef имена, приводящие к ошибкам.


Однако если вы typedef сначала указатель типа, поэтому он представлен как один токен, вы можете использовать что-то вроде:

typedef int* pInt;
DECLEAR_RINGQUEUE(pInt);

Это должно работать, исходя из того, что следующий код:

#define MAX_SIZE 32

#define DECLEAR_RINGQUEUE(type) \
    typedef struct RINGQUEUE_##type { \
        type data[MAX_SIZE]; \
    } RINGQUEUE_##type

DECLEAR_RINGQUEUE(int);

typedef int* pInt;
DECLEAR_RINGQUEUE(pInt);

генерирует при прохождении через препроцессор:

typedef struct RINGQUEUE_int { int data[32]; } RINGQUEUE_int;

typedef int* pInt;
typedef struct RINGQUEUE_pInt { pInt data[32]; } RINGQUEUE_pInt;

и компилируется без ошибок.

Другие вопросы по тегам