Реализация шаблона, совместимая для указателя в 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;
и компилируется без ошибок.