В вашем макросе PAIR_TYPE
вам нужно избавиться от точки с запятой в конце, чтобы имя, которое вы даете для типа, было частью typedef.Прямо сейчас, когда вы делаете:
PAIR_TYPE(char *, uint32_t) mypair;
.. вы получаете:
typedef struct {
char * first;
uint32_t second;
}; mypair;
.. с точкой с запятой между }
и mypair
, которая не должна бытьтам.
Вам также понадобится использовать приведение для вашего макроса MAKE_PAIR, чтобы работать так, как вы его используете.Прямо сейчас строка:
p = MAKE_PAIR("normal", target);
.. расширяется до:
p = {"normal", target};
.., которая не будет работать.Но если вы добавите приведение:
p = (mypair)MAKE_PAIR("normal", target);
.., тогда расширенная строка будет:
p = (mypair){"normal", target};
.., которая может работать, так как приведение типа сообщает компилятору, какие поля между{
и }
должны быть.Обратите внимание, что вы устанавливаете char *
в первом поле, чтобы указывать на литерал "normal"
, а не копировать строку.