C++学习之cstdbool和cstddef头文件封装源码分析

 更新时间:2022年09月05日 14:23:23   作者:桑榆晚  
这篇文章主要为大家介绍了C++学习之cstdbool和cstddef头文件封装源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

cstdbool是C++对stdbool.h头文件的封装,里面定义了与bool变量相关的宏;

cstddef是C++对stddef.h头文件的封装,里面定义一些特殊类型(如size_t),有用的宏函数(offsetof)。

平时我们都是使用这些宏或者宏函数,对于它们的原理还不是很清楚,是怎么实现这些功能的呢?接下来我们就一一来看一看源码实现。

stdbool.h

cstdbool实现

代码参考:www.aospxref.com/android-13.…

在cstdbool文件中的逻辑很简单,解除__bool_true_false_are_defined的定义,然后将其定义为1,标识bool,true,false都已经被C++定义了。

 #include <__config>
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #pragma GCC system_header
 #endif
 #undef __bool_true_false_are_defined
 #define __bool_true_false_are_defined 1

C语言的原生实现stdbool.h

参考代码:www.aospxref.com/android-13.… 在该文件中,如果当前不是C++环境,那么我们将bool/true/false都进行定义,同时将__bool_true_false_are_defined定义为1,以便后续使用。

 #ifndef __cplusplus
 #define true 1
 #define false 0
 #define bool _Bool
  #endif
  #define __bool_true_false_are_defined 1

小结

stdbool.h实际上是为了解决C/C++的兼容问题出现的。

stddef.h

代码参考:www.aospxref.com/android-13.…

常量NULL的定义

从这里可以看出,实际上NULL有三种实现方式,0L,((void*)0)都是我们在C语言中常用的方式,其中的nullptr是C++定义的内部类型,能够做到对很多情况的适配,不是一个单独的基本类型。

 #if __cplusplus >= 201103L
 #define NULL nullptr
 #elif defined(__cplusplus)
 #define NULL 0L
 #else
 #define NULL ((void*)0)
 #endif

类型的定义

其中定义了如下的类型:

  • ptrdiff_t---保存指针减法的结果
  • size_t---无符号整数,表示类型占据的size大小
  • max_align_t---最大默认对齐的类型
  • nullptr_t---C++中的空指针类型 参考代码:www.aospxref.com/android-13.…

x86_64的相关实现如下: ptrdiff_t使用long定义,指针减法,实际上是64位数的减法,long足够表示; size_t使用long表示; max_align_t定义为拥有long long数据和long double数据的结构体; nullptr_t定义为nullptr的类型。

 #define _Addr long
  #if defined(__NEED_ptrdiff_t) && !defined(__DEFINED_ptrdiff_t)
  typedef _Addr ptrdiff_t;
  #define __DEFINED_ptrdiff_t
  #endif
  #if defined(__NEED_size_t) && !defined(__DEFINED_size_t)
  typedef unsigned _Addr size_t;
  #define __DEFINED_size_t
  #endif
  #if defined(__NEED_max_align_t) && !defined(__DEFINED_max_align_t)
  typedef struct { long long __ll; long double __ld; } max_align_t;
  #define __DEFINED_max_align_t
  #endif
typedef decltype(nullptr) nullptr_t;

offsetof宏

offsetof (type,member)接受两个参数,类型和成员名,返回该成员的偏移地址。

听上去这个实现起来很简单,我们来看看这个精巧的宏是如何设计的。

  #if __GNUC__ > 3
  #define offsetof(type, member) __builtin_offsetof(type, member)
  #else
  #define offsetof(type, member) ((size_t)( (char *)&(((type *)0)->member) - (char *)0 ))
  #endif

不考虑使用内建函数实现的方式,我们来看看第二种方式,这是一个比较复杂的宏,让我们来一步步拆开它,并体会其中的精妙:

((size_t)( (char *)&(((type *)0)->member) - (char *)0 ))

第一步:返回值类型强转为size_t,规范为byte数,也即是偏移量;

(char *)&(((type *)0)->member) - (char *)0

第二步:char*指针转换然后做减法,得到byte数的差值;

第三步:((type )0)->member这里使用了0指针强转为type指针,然后指向成员member,此时这个变量的地址相当于0+member偏移,然后取地址,指针转换为char*后做减法

这个方法的好处在于,只使用了0指针,没有通过其它变量的构造,很简单地找到了偏移地址,而且这个过程中做的每一步类型转换都是必要的。具体细节读者可以再品味一下,这也是我们阅读源码的收获。

以上就是C++学习之cstdbool和cstddef头文件封装源码分析的详细内容,更多关于C++头文件封装cstdbool cstddef的资料请关注脚本之家其它相关文章!

相关文章

  • C++中的指针常量、常量指针与常量指针常量详解

    C++中的指针常量、常量指针与常量指针常量详解

    本文深入解析了C++中指针与const的组合使用,包括指针常量、常量指针和常量指针常量三种类型,下面就拉介绍一下这三种的使用与区别,具有一定的参考价值,感兴趣的可以了解一下
    2026-01-01
  • 一篇文章带你入门C语言:数组

    一篇文章带你入门C语言:数组

    这篇文章主要介绍了C语言中数组的一些基本知识小结,其中重点是对于数组的内存分配相关方面的知识整理,需要的朋友可以参考下
    2021-08-08
  • C语言菜鸟基础教程之数据类型

    C语言菜鸟基础教程之数据类型

    在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
    2017-10-10
  • C语言编程中统计输入的行数以及单词个数的方法

    C语言编程中统计输入的行数以及单词个数的方法

    这篇文章主要介绍了C语言编程中统计输入的行数以及单词个数的方法,利用最基础的循环和判断语句写成,需要的朋友可以参考下
    2015-11-11
  • 详解C++中string的用法和例子

    详解C++中string的用法和例子

    string是C++标准库的一个重要的部分,主要用于字符串处理。这篇文章主要介绍了C++ string的用法和例子,需要的朋友可以参考下
    2018-05-05
  • QT中几种常用的排序函数用法总结

    QT中几种常用的排序函数用法总结

    Qt是目前最先进、最完整的跨平台C++开发工具,下面这篇文章主要给大家介绍了关于QT中几种常用的排序函数用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • C语言 如何用堆解决Topk问题

    C语言 如何用堆解决Topk问题

    TopK问题即在N个数中找出最大的前K个,这篇文章将详细讲解如何利用小根堆的方法解决TopK问题,文中代码具有一定参考价值,快跟随小编一起学习一下吧
    2021-12-12
  • NSString与C字符串之间的相互转换

    NSString与C字符串之间的相互转换

    本文将详细介绍NSString与C字符串之间的相互转换,需要的朋友可以参考下
    2012-11-11
  • Linux下Select多路复用实现简易聊天室示例

    Linux下Select多路复用实现简易聊天室示例

    大家好,本篇文章主要讲的是Linux下Select多路复用实现简易聊天室示例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C语言基于EasyX库实现有颜色弹跳小球

    C语言基于EasyX库实现有颜色弹跳小球

    这篇文章主要为大家详细介绍了C语言基于EasyX库实现有颜色弹跳小球,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论