type __builtin_choose_expr (const_exp, exp1, exp2)

这个函数的第一个参数必须是常量表达式,因为之前我已经说过,它属于编译时行为,而非运行时行为,跟sizeof和typeof一样。这个函数是一个谓词函数,如果const_expr的结果非0,那么生成exp1,且返回类型type也与exp1表达式的类型一致;否则生成exp2,并且返回类型type也与exp2的类型一致。由于是编译时行为,因此exp1与exp2表达式所产生的目标代码是互斥的,生成了exp1就不会存在exp2。
实例:

#define __TYPE_IS_LL(t) (__same_type((t)0, 0LL) || __same_type((t)0, 0ULL))
# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))__builtin_choose_expr(__TYPE_IS_LL(t), 0LL, 0L)

__builtin_types_compatible_p(typeof(a), typeof(b))是比较两个类型是否相同。
所以__builtin_choose_expr(__TYPE_IS_LL(t), 0LL, 0L)等价于t为0LL或0ULL时,等于LL类型,否则为0L类型。当然这句话在32位系统上比较有意义,因为64位系统L和LL都为8个字节。

__builtin_choose_expr相关推荐

  1. C语言__builtin_choose_expr实现函数重载

    __builtin_choose_expr是编译阶段的行为,不是运行时的行为. #include <stdlib.h> #include <stdio.h>void show_ ...

  2. linux系统调用(syscall)原理

    引言:分析Android源码的过程中,要想从上至下完全明白一行代码,往往涉及app.framework.native一直到kernel,可能迷失到代码世界,明白了系统调用原理,或许能帮你峰回路转,找到 ...

  3. Linux内核中max()宏的奥妙何在?(二)——大神Linus对这个宏怎么看?

    最新max()宏 上回,我们在<Linux内核中max()宏的奥妙何在?(一)>一文中说到,在3.18.34版Linux内核源码中的max()宏,采用了GCC的扩展特性,可以避免一些错误. ...

  4. 我们应该搞清楚分支预测

    分支预测的英文名字是「Branch Prediction」 大家可以在Google上搜索这个关键字,可以看到关于分支预测的很多内容,不过要搞清楚分支预测如何工作的,才是问题的关键. 分支预测对程序的影 ...

  5. Linux kernel中常见的宏整理

    0x00 宏的基本知识 // object-like #define 宏名 替换列表 换行符 //function-like #define 宏名 ([标识符列表]) 替换列表 换行符 替换列表和标识 ...

  6. Linux系统调用(syscall)原理(转)

    引言:分析Android源码的过程中,要想从上至下完全明白一行代码,往往涉及app.framework.native一直到kernel,可能迷失到代码世界,明白了系统调用原理,或许能帮你峰回路转,找到 ...

  7. c语言中用括号将花括号括起来给变量赋值

    #define max(x,y) ({ \     typeof(x) _x = (x); \     typeof(y) _y = (y); \     (void) (&_x == &am ...

  8. Linux系统调用(syscall)原理(转载)

    转载链接: http://gityuan.com/2016/05/21/syscall/ 先来个整体介绍: 系统调用工作原理: 一般情况下,用户进程是不能访问内核的.它既不能访问内核所在的内存空间,也 ...

  9. linux(07)之内核系统调用

    Linux(07)之内核系统调用 Author:Once Day Date:2023年1月7日 漫漫长路,才刚刚开始- 文章目录 Linux(07)之内核系统调用 1.概述 2. 系统调用 2.1 无 ...

最新文章

  1. 微信公众号管理系统 RhaPHP1.2.5更新啦!
  2. SSM整合(基础框架)代码
  3. VTK:图片之ImageSobel2D
  4. Omap3530 的GPIO中断设置
  5. ikbc机械键盘打字出现重复_超小无线机械键盘,绝佳移动打字体验
  6. 1数组中重复的数字-面试题目3
  7. arcengine遍历属性表_Redis源码解析四--跳跃表
  8. vue 路由懒加载,组件异步加载
  9. php 爬数据库,php爬虫爬取数据并存储至数据库
  10. 【转】:TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute
  11. 【PAT】1009. 说反话 (20)
  12. cc2530dma控制器功能_CC2530芯片DMA控制器配置
  13. 电力系统的常用仿真模块MATLAB/SIMULINK(1)
  14. CSS(三)盒子模型
  15. 高级设计总监的设计方法论——5W1H需求分析法 KANO模型分析法
  16. photoshop教程裁剪和拉直照片以改善构图
  17. vmware linux top si高以及网卡队列、软负载相关优化
  18. Xavier NX+KU040图像处理卡
  19. 【数据分析与挖掘】数据分析学习及实践记录 | part 03-matplotlib常用统计图
  20. 论文研读 Rotated Test Problems for Assessing the Performance of MOEAs

热门文章

  1. CDH通过parcels安装组件,激活时卡住,取消激活
  2. Oracle 服务器 客户端 US7ASCII、 UTF8字符编码问题
  3. 路由token验证和路由守卫~~狂徒李四
  4. VC+API模拟键盘按键(详解篇)
  5. 如何领取门票参加中国北京科技产业博览会?
  6. PPT文件不能编辑的原因
  7. 快速复现利用Log4j漏洞启动windows计算器
  8. HTML5期末大作业:出行网站设计——西安旅游-高质量(9页) HTML+CSS+JavaScript 学生DW网页设计
  9. 2021年5月30日 星期日 晴
  10. 产品设计体会(0013)产品经理应该是管理者么