使用_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 *
with char[]
给我
error: type 'char []' in generic association incomplete
(据我所知)编译此文件的唯一方法是:
- 将字符串文字转换为适当的类型。这很丑陋并且(在我看来)违背了这一点
_Generic
首先。
- Use
char[14]
作为类型说明符。你有got开玩笑吧...
我的假设是数组在传递给时会衰减为指针_Generic
,但显然不是。又怎样do I use _Generic
与字符串文字?这是唯一的两个选择吗?
我在用着clangDebian 上的 3.2。不幸的是,它是我可以访问的唯一支持此功能的编译器,因此我无法判断这是否是编译器错误。
这是一个解决方案:
#include <stdio.h>
#define foo(x) _Generic((0,x), char*: puts(x))
int main()
{
foo("Hello, world!");
return 0;
}
编译并生成:
$ clang t.c && ./a.out
Hello, world!
虽然有点蹩脚,但我没有找到更好的方法x
使用 Apple LLVM 版本 4.2 (clang-425.0.28)(基于 LLVM 3.2svn),衰减为指向 char 的指针,也不会以您需要的模糊方式匹配其类型。
根据Jens Gustedt 的这篇博文 https://gustedt.wordpress.com/2015/05/11/the-controlling-expression-of-_generic/,GCC 的行为是不同的(在 GCC 中,字符串自动衰减为指针)_Generic
上下文,显然)。
顺便说一句,在 C 中,字符串文字的类型是数组char
,不属于const char
。拒绝char []
as 类型名称 in a 泛型关联不是编译器错误:
通用选择不得有超过一个默认通用关联。通用关联中的类型名称应指定complete除可变修改类型之外的对象类型。 (6.5.1.1:2,我强调)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)