环保主题静态网站,装修网站推广方案,wordpress无法上传mp3,今天军事新闻最新消息__builtin_choose_expr 是 GCC 编译器的内置函数#xff0c;它允许在编译时根据条件表达式的值选择两个表达式其中之一。其语法结构如下#xff1a;
__builtin_choose_expr(constant_expression, expression1, expression2)
这个内置函数根据第一个参数 constant_expressio…__builtin_choose_expr 是 GCC 编译器的内置函数它允许在编译时根据条件表达式的值选择两个表达式其中之一。其语法结构如下
__builtin_choose_expr(constant_expression, expression1, expression2)
这个内置函数根据第一个参数 constant_expression 的结果在 expression1 和 expression2 中选择一个。如果 constant_expression 是非零的即认为是 true则选择 expression1; 如果是零即认为是 false则选择 expression2。
constant_expression 必须是编译时可知的常量表达式而不是运行时才能确定的值。
这个功能类似于C语言中的 ? : 三元条件运算符但关键的区别在于 __builtin_choose_expr 是在编译时进行选择这意味着只有被选中的那个表达式会被编译进最终的程序。下面是一个例子
int main() {int x __builtin_choose_expr(1, 42, 0); // 由于条件为 true1所以 x 将被赋值为 42int y __builtin_choose_expr(0, 42, 0); // 由于条件为 false0所以 y 将被赋值为 0return 0;
}
使用案例
#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 long 或 unsigned long long 兼容来定义一个新的变量 a。
首先来看看这些宏的组成部分 __same_type(a, b)这个宏使用了 GCC 的内置函数 __builtin_types_compatible_p 来检查两个类型表达式 a 和 b 是否相同。typeof(a) 会获取 a 的类型同理 typeof(b) 获取 b 的类型。 __TYPE_AS(t, v) 宏利用 __force 宏将类型 t 的值 0 转换成 t 类型并检查它是否与变量 v 的类型相同。 __TYPE_IS_LL(t) 宏检查传入的类型 t 是否与 long long 0LL或 unsigned long long0ULL类型相同或兼容。 __SC_LONG(t, a)综合使用上述宏根据 t 的类型选择适当的类型long long 或者 long来定义变量 a。
在 __SC_LONG 宏中__builtin_choose_expr 函数基于 __TYPE_IS_LL 宏的结果选择 0LL 或 0L并用 __typeof 来获取该结果的类型。如果 t 与 long long 或 unsigned long long 类型兼容则变量 a 的类型就会是 long long否则变量 a 的类型就会是 long。
所以简单地说__SC_LONG 宏就是根据 t 的类型来声明变量 a让 a 成为 long long 或 long 类型中适合 t 类型的一个。这样的设计允许代码根据不同平台上类型大小的差异来选择合适的类型这在跨平台编程时是非常有用的尤其是在你需要处理不同数据模型如 32 位与 64 位系统时。