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с нужными вам типами.

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