_Generic在C11中的语法和示例用法


70

我听说C11添加了泛型。我已经用Google搜索了一下,看了一些文章,了解到有一个新的关键字(_Generic)等等。但我似乎无法掌握所有内容。

它类似于C#中的泛型或C ++中的模板吗?谁能给我关于C11泛型定义,其语法和简单示例用法示例的简短说明?


3
您可以阅读或下载C11标准草案(PDF版本)。在第6.5.1.1节中有一个示例。
pmg 2012年

4
C ++中没有像“泛型”这样的东西。
Griwes 2012年

9
@格里维斯,你去。还有挑剔吗?
ApprenticeHacker 2012年

Answers:


51

是一个很好的介绍。这是概述:

通用选择是通过新关键字_Generic实现的。语法类似于类型的简单switch语句:_Generic( 'a', char: 1, int: 2, long: 3, default: 0) 取值为2(字符常量在C中为int)。

基本上,它的工作方式类似于的switch,其中标签是类型名称,将根据第一个表达式的类型('a'上述)进行测试。结果成为评估的结果_Generic()


1
刚意识到我链接到了您所访问的同一页面。.但是,这也就不足为奇了。奇怪的是,它确实是唯一可获取有关该信息的好地方……
Alex Gray

93

我看到的最好的例子启发了以下(可运行的)示例,该示例为破解内省开辟了各种奇特的可能性...


1
哇。您使用什么编译器?在我的机器(Linux,GCC 4.9+)上,最新类型显示为“指向int的指针”:int数组为“指向int的指针”
user1284631 2015年

> Apple LLVM版本6.1.0(clang-602.0.45)(基于LLVM 3.6.0svn)
亚历克斯·格雷

11
这很整洁,但是您永远无法以这种方式涵盖所有类型...无论如何,“ Amazeballs”的+1 ...
einpoklum

6

我使用的是clion 1.2.4,而clion现在不支持c11,因此我在c99中使用以下代码而不是_Generic


6
“在这里,我代替_Generic使用的是什么”在一个问题上有8票赞成,请问如何使用_Generic的示例
Michael Mrozek,

7
@MichaelMrozek-此答案提供了另一种方法,如果没有其他要求,则可以说明所询问概念任何事物的替代方法的一个特征是,它将始终为被询问的事物提供新的独特视角。老师一直在使用这种技术。如果您站在一个地方凝视着某个东西却又不了解它,那就走来走去,从另一个角度看待它。这总是提供新的信息。那,无论是否有意,都是这个答案提供的一件事。(为此+1)
莱耶克'19

1
这是GNU C,而不是C99
osvein'5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.