_Generic
关键字是 C11 标准中引入的一个新特性,它允许在编译时根据表达式的类型来执行不同的操作。这可以用于编写类型安全的宏,或者根据表达式的类型执行不同的代码分支。下面是一个简单的示例,展示了如何使用 _Generic
关键字:
#include <stdio.h>
#define PRINT_TYPE(x) _Generic((x), \
char: puts("char"), \
short: puts("short"), \
int: puts("int"), \
long: puts("long"), \
float: puts("float"), \
double: puts("double"), \
default: puts("other type")
int main() {
char c = 'a';
short s = 10;
int i = 20;
long l = 30L;
float f = 3.14f;
double d = 2.718;
PRINT_TYPE(c); // 输出: char
PRINT_TYPE(s); // 输出: short
PRINT_TYPE(i); // 输出: int
PRINT_TYPE(l); // 输出: long
PRINT_TYPE(f); // 输出: float
PRINT_TYPE(d); // 输出: double
PRINT_TYPE('b'); // 输出: char
PRINT_TYPE(3.0); // 输出: double
// 使用未定义的类型将会匹配 default 分支
_Generic((3.0 + 2), default: puts("unmatched type") ); // 输出: unmatched type
return 0;
}
在这个例子中,我们定义了一个宏 PRINT_TYPE
,它接受一个参数 x
,并使用 _Generic
关键字来根据 x
的类型选择执行哪个分支。每个类型后面跟着一个冒号和一个要执行的表达式。如果 x
的类型与列出的类型之一匹配,那么相应的表达式就会被执行。如果没有任何类型匹配,那么就会执行 default
分支(如果存在的话)。
请注意,_Generic
关键字在编译时工作,因此它不会产生运行时开销。然而,它只能用于编译时常量表达式,并且它不能用于函数指针的类型检查(即你不能根据函数指针所指向的函数的返回类型来使用 _Generic
)。
为了使用 _Generic
,你的编译器必须支持 C11 或更高版本的标准。如果你使用的是旧版本的编译器或者没有启用 C11 支持,那么上述代码将无法编译通过。确保你的编译器设置正确,并且启用了 C11 或更高版本的支持(通常是通过编译选项 -std=c11
或类似的选项来启用的)。