c11 _Общие типы добавления - PullRequest
3 голосов
/ 16 марта 2012

Как добавить дополнительные типы в общие функции c11?

Вам нужно # 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)

Ответы [ 2 ]

8 голосов
/ 16 марта 2012

Я не уверен, что полностью понимаю ваш вопрос.Вы имеете в виду, что у вас есть универсальный макрос типа, который дается какой-то библиотекой, и вы хотите изменить его на свой собственный новый тип?

Что вы всегда можете сделать, это дать ему другое имя и использовать значение по умолчаниюcase для получения предоставленного поведения:

#define to_str2(X) _Generic((X), default: to_str(X), int: i_str(X))

Edit :

Это не будет работать идеально, потому что вам придется поместить оценку аргумента функции в _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)
3 голосов
/ 16 марта 2012

Если это ваш код, вам придется #undef это и повторно #define это, да. Нет способа расширить универсальное выражение типа (AFAIK).

Если это не ваш код, я бы ввел второе выражение с расширением, как предложил Дженс.

...