C11の機能を使用して_Generic
、文字列リテラルをどのように処理しますか?
例えば:
#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
選択肢はこの2つだけですか?
Debian でclang 3.2 を使用しています。残念ながら、この機能をサポートしているのは私がアクセスできる唯一のコンパイラであるため、コンパイラのバグかどうかはわかりません。