You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:50:54