在C语言中如何在编译期判断表达式为struct或union?
编译期判断表达式是否为struct/union类型
C11标准本身没有提供直接在编译期判断表达式类型是否为struct或union的机制——_Generic只能针对指定的具体类型做分支匹配,无法泛型地识别所有struct/union类型。不过GCC(以及兼容GCC的编译器如Clang)提供了非标准的内置编译期函数来实现这个需求。
GCC的解决方案
GCC提供了两个内置的编译期判断函数:
__is_struct(type):如果传入的类型是struct类型,返回1;否则返回0__is_union(type):如果传入的类型是union类型,返回1;否则返回0
结合GCC的typeof关键字(用来获取表达式的类型),可以轻松封装出判断任意表达式类型的宏:
#include <stdio.h> struct DemoStruct { int val; }; union DemoUnion { float num; }; #define IS_STRUCT(expr) __is_struct(typeof(expr)) #define IS_UNION(expr) __is_union(typeof(expr)) int main() { struct DemoStruct s; union DemoUnion u; int integer; double fp; // 测试判断结果 printf("s is struct: %d\n", IS_STRUCT(s)); // 输出1 printf("u is union: %d\n", IS_UNION(u)); // 输出1 printf("int is struct: %d\n", IS_STRUCT(integer)); // 输出0 printf("double is union: %d\n", IS_UNION(fp)); // 输出0 return 0; }
这些内置函数是编译期求值的,不会产生运行时开销,完全符合需求。需要注意的是,这是GCC专属的非标准扩展,其他编译器(比如MSVC)需要使用各自的特性(例如MSVC也有同名的__is_struct和__is_union实现,但语法细节可能有差异)。
内容的提问来源于stack exchange,提问作者user3093235
相关产品推荐
相关产品推荐

