版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

仓库源文站点原文


title: 随笔 - C 语言的泛型 categories:


简要介绍 C11 之前和之后的泛型写法

<!-- more -->

C11 之前

利用宏实现

{% icodeweb blog lang:c draft-002/1.c %}

其中(void)(&_min_1 == &_min_2);利用了不同类型指针做逻辑比较在编译过程会报错来保证两参数类型相同

C11 之后

C11 中添加了_Generic关键字, 使得编写泛型函数更方便了

用法1:

generic-selection:

_Generic ( assignment-expression , generic-assoc-list )

generic-assoc-list:

generic-association

generic-assoc-list , generic-association

generic-association:

type-name : assignment-expression

default : assignment-expression

例如2:

{% icodeweb blog lang:c draft-002/2.c %}

输出:

intabs:12
floatabs:12.040000
doubleabs:13.098760
b=0,c=1
a=10,b=1,c=1

简要讲讲代码的含义

_Generic(a + 0.1f, int : b, float : c, default : b)++;

a 为int, a + 0.1ffloat, 所以_Generic执行float对应的操作, 即返回c, 最终该语句为c++

_Generic(a += 1.1f, int : b, float : c, default : b)++;

a 为int, a += 1.1f不改变a的值, _Generic判断a的类型, 执行int对应的操作, 即返回b, 最终该语句为b++


  1. ISO/IEC 9899:201x - N1570 - Programming languages - C

  2. C11_百度百科