Используя функцию _Generic
в C11, как вы справляетесь со строковыми литералами?
Например:
#include <stdio.h>
#define foo(x) _Generic((x), char *: puts(x))
int main()
{
foo("Hello, world!");
return 0;
}
дает эту ошибку на clang:
controlling expression type 'char [14]' not compatible with any generic association type
Замена char *
на char[]
дает мне
error: type 'char []' in generic association incomplete
Единственные способы (насколько мне известно) получить это для компиляции:
- Приведите строковый литерал к соответствующему типу. Это уродливо и (на мой взгляд) в первую очередь противоречит пункту
_Generic
. - Используйте
char[14]
в качестве спецификатора типа. Вы, должно быть, должны шутить надо мной...
Я предполагал, что массивы будут распадаться на указатели при передаче в _Generic
, но, очевидно, это не так. Итак, как делать использование _Generic
со строковыми литералами? Это единственные два варианта?
Я использую clang 3.2 в Debian. К сожалению, это единственный доступный мне компилятор, который поддерживает эту функцию, поэтому я не могу сказать, является ли это ошибкой компилятора или нет.