Используя функцию _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. К сожалению, это единственный компилятор, к которому у меня есть доступ, который поддерживает эту функцию, поэтому я не могу сказать, является ли это ошибкой компилятора или нет.