__builtin_choose_expr内置函数使用

__builtin_choose_expr 是 GCC 编译器的内置函数,它允许在编译时根据条件表达式的值选择两个表达式其中之一。其语法结构如下:

cpp 复制代码
__builtin_choose_expr(constant_expression, expression1, expression2)

这个内置函数根据第一个参数 constant_expression 的结果在 expression1expression2 中选择一个。如果 constant_expression 是非零的(即,认为是 true),则选择 expression1; 如果是零(即,认为是 false),则选择 expression2

constant_expression 必须是编译时可知的常量表达式,而不是运行时才能确定的值。

这个功能类似于C语言中的 ? : 三元条件运算符,但关键的区别在于 __builtin_choose_expr 是在编译时进行选择,这意味着只有被选中的那个表达式会被编译进最终的程序。下面是一个例子:

cpp 复制代码
int main() {
    int x = __builtin_choose_expr(1, 42, 0); // 由于条件为 true(1),所以 x 将被赋值为 42
    int y = __builtin_choose_expr(0, 42, 0); // 由于条件为 false(0),所以 y 将被赋值为 0
    return 0;
}

使用案例:

cpp 复制代码
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
#define __TYPE_AS(t, v)	__same_type((__force t)0, v)
#define __TYPE_IS_LL(t) (__TYPE_AS(t, 0LL) || __TYPE_AS(t, 0ULL))
#define __SC_LONG(t, a) __typeof(__builtin_choose_expr(__TYPE_IS_LL(t), 0LL, 0L)) a

__SC_LONG 宏的作用是基于传入的类型 t 是否与 long longunsigned long long 兼容,来定义一个新的变量 a

首先,来看看这些宏的组成部分:

  1. __same_type(a, b):这个宏使用了 GCC 的内置函数 __builtin_types_compatible_p 来检查两个类型表达式 ab 是否相同。typeof(a) 会获取 a 的类型,同理 typeof(b) 获取 b 的类型。

  2. __TYPE_AS(t, v) 宏:利用 __force 宏将类型 t 的值 0 转换成 t 类型,并检查它是否与变量 v 的类型相同。

  3. __TYPE_IS_LL(t) 宏:检查传入的类型 t 是否与 long long0LL)或 unsigned long long0ULL)类型相同或兼容。

  4. __SC_LONG(t, a):综合使用上述宏,根据 t 的类型,选择适当的类型(long long 或者 long)来定义变量 a

__SC_LONG 宏中,__builtin_choose_expr 函数基于 __TYPE_IS_LL 宏的结果选择 0LL0L,并用 __typeof 来获取该结果的类型。如果 tlong longunsigned long long 类型兼容,则变量 a 的类型就会是 long long;否则,变量 a 的类型就会是 long

所以简单地说,__SC_LONG 宏就是根据 t 的类型来声明变量 a,让 a 成为 long longlong 类型中适合 t 类型的一个。这样的设计允许代码根据不同平台上类型大小的差异来选择合适的类型,这在跨平台编程时是非常有用的,尤其是在你需要处理不同数据模型(如 32 位与 64 位系统)时。

相关推荐
励志成为嵌入式工程师2 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
Peter_chq2 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
hikktn4 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
观音山保我别报错4 小时前
C语言扫雷小游戏
c语言·开发语言·算法
小林熬夜学编程6 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
墨墨祺7 小时前
嵌入式之C语言(基础篇)
c语言·开发语言
躺不平的理查德7 小时前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
幼儿园园霸柒柒8 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
好想有猫猫8 小时前
【51单片机】串口通信原理 + 使用
c语言·单片机·嵌入式硬件·51单片机·1024程序员节
摆烂小白敲代码9 小时前
背包九讲——背包问题求方案数
c语言·c++·算法·背包问题·背包问题求方案数