c语言的 _Generic 关键字实验

时间:2024-07-20 21:15:54

_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 或类似的选项来启用的)。