1 泛型编程
泛型编程(Generic Programming)是一种编程范式,旨在通过定义通用的算法和数据结构,使得这些算法和数据结构能够适用于不同的数据类型。它的核心思想是通过参数化类型来实现代码的复用和灵活性。
在泛型编程中,程序员可以编写与类型无关的代码,这些代码可以与任何类型一起工作,而不需要在编写代码时指定具体的类型。这使得代码更加通用、可维护,并减少了重复劳动。
虽然C语言本身不支持泛型编程,但是在C11标准中引入了一种称为“泛型选择”(_Generic)的机制,这使得C语言在一定程度上可以支持泛型编程,但它的功能相对简单,主要用于选择不同的代码段来处理不同类型的表达式。
2 泛型选择
泛型选择需要”_Generic”关键字支持,其是C11标准中的新特性,用于构造泛型选择表达式。通过泛型选择表达式,程序可以根据表达式的类型选择不同的执行代码段,从而实现了类似的泛型编程。以下是泛型选择表达式的通用语法结构:
_Generic(expression, type1: code1, type2: code2, ..., default: default_code)
expression
是要根据其类型选择代码的表达式type1
,type2
, … 是数据类型code1
,code2
, … 是对应类型的代码块default_code
是可选的,作为默认处理路径,当表达式的类型不匹配任何指定类型时执行
3 功能示例
泛型选择表达式不是预处理指令,但是其通常用作为#define
宏定义的一部分。泛型选择表达式和switch
类似,不过前者用表达式的类型匹配标签,,后者用表达式的值匹配标签。
3.1 类型选择值
#include <stdio.h> #define print_type(x) _Generic((x), \ int: "int", \ float: "float", \ double: "double", \ char*: "string", \ default: "unknown type") int main(void) { int a = 5; float b = 3.14F; double c = 2.718; char* d = "Hello"; printf("a is of type: %s\n", print_type(a)); // 输出 "a is of type: int" printf("b is of type: %s\n", print_type(b)); // 输出 "b is of type: float" printf("c is of type: %s\n", print_type(c)); // 输出 "c is of type: double" printf("d is of type: %s\n", print_type(d)); // 输出 "d is of type: string" return 0; }
程序输出结果为:
a is of type: int
b is of type: float
c is of type: double
d is of type: string
3.2 类型选择函数
#include <stdio.h> #define print(x) _Generic((x), \ int: print_int, \ double: print_double, \ default: print_unknown)(x) void print_int(int x) { printf("Integer: %d\n", x); } void print_double(double x) { printf("Double: %f\n", x); } void print_unknown(void *x) { printf("Unknown type\n"); } int main() { int a = 5; double b = 3.14; print(a); // Output: Integer: 5 print(b); // Output: Double: 3.14 // This will call print_unknown since 'char' is not defined in _Generic print('c'); // Output: Unknown type return 0; }