c11 _Общие типы добавления
Как добавить дополнительные типы в c11 _Generic Functions?
Вы должны #undef/re # определить это?(Если так, то следующая работа) или есть более хороший способ?
#define to_str(X) _Generic((X), \
long double: ld_str, \
double: d_str, \
float: f_str, \
)(X)
#undef to_str
#define to_str(X) _Generic((X), \
long double: ld_str, \
double: d_str, \
float: f_str, \
int: i_str, \
)(X)
3 ответа
Я не уверен, что полностью понимаю ваш вопрос. Вы имеете в виду, что у вас есть универсальный макрос типа, который дается какой-то библиотекой, и вы хотите изменить его на свой собственный новый тип?
Что вы всегда можете сделать, это дать ему другое имя и использовать регистр по умолчанию, чтобы получить предоставленное поведение:
#define to_str2(X) _Generic((X), default: to_str(X), int: i_str(X))
Редактировать:
Это не будет работать идеально, потому что вы должны поместить оценку аргумента функции внутри _Generic
, Это означает, в частности, что тип X
должен быть совместим со всеми ветвями вложенных обобщенных выражений.
Было бы проще, если бы у рассматриваемой библиотеки был макрос, который просто возвращал бы саму функцию, без (X)
, сказать to_strGen
и это никогда не оценит X
, Тогда вы могли бы сделать
#define to_str2Gen(X) _Generic((X), default: to_strGen(X), int: i_str)
#define to_str2(X) to_str2Gen(X)(X)
Если это ваш код, вам придется #undef
это и ре#define
это да. Нет никакого способа расширить универсальное выражение типа (AFAIK).
Если это не ваш код, я бы ввел второе выражение с расширением, как предложил Дженс.
Одна вещь, которую вы можете сделать, это:
#define to_str(X) _Generic((X), \
long double: ld_str, \
double: d_str, \
float: f_str \
EXTRA_TYPES \
)(X)
#define EXTRA_TYPES \
,int: i_str, \
char: c_str
обратите внимание, что запятая является частью, а не макроса. Это сделатьto_str
работать, даже если было пусто.
Теперь все, что вам нужно сделать, это определитьEXTRA_TYPES
с нужными вам типами.