比hello 还简单的程序. 主要是为了分析一下预处理结果

#include <stdio.h>
int main()
{
    ssize_t a=5;
    return 0;
}

想看一看stdio.h中都包含了什么?
想看一看ssize_t 到底是什么类型.
好说,做一下预处理即可,生成main.cpp.i
gcc 预处理后面的数字

官方参考链接

https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html

简单说: 如下格式:
# linenum filename flags

linenum: 该文件中行号
flags: 有1,2,3,4
1. 一个新文件的开始
2. 又回到了这个文件,当它包含其它文件时
3. 下面的文本来自于系统头文件
4. 下面的文本相当于extern "C" 块

顺便附两张图,说明ssize_t, size_t 是在哪里定义的.

由图可知:
在"/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h"
第 212 行定义了
typedef long unsigned int size_t;

在"/usr/include/stdio.h" 90 行附近
typedef __ssize_t ssize_t;

在 "/usr/include/x86_64-linux-gnu/bits/types.h" 第122行 下方
定义了类型__ssize_t
typedef long int __ssize_t;

虽然结果看得十分清晰,这得益于预处理的结果.
但实际的定义过程还有些复杂
__STD_TYPE __SSIZE_T_TYPE __ssize_t; /* Type of a byte count, or error.  */

# define __STD_TYPE        __extension__ typedef
__SSIZE_T_TYPE 这个宏却逃逸了!!??
要穷追这个宏定义吗? 又要找些手段来对付它了!
grep 并不是一个好办法,算一个笨办法,最好能直接追踪它的宏定义链.

前后浏览了一下,在它包含的文件里
/usr/include/x86_64-linux-gnu/bits/typesizes.h
#define __SSIZE_T_TYPE        __SWORD_TYPE
在本文件里
/usr/include/x86_64-linux-gnu/bits/types.h
# define __SWORD_TYPE        long int

这样就没有一点悬念了. en,攻无不克!
是的,预处理的结果把#define 全部给过滤了,进行了展开,
不过展开的过程就看不到了,想看过程吗?本篇太长了,且看下篇了.

size_t 到底是什么类型(有图有真相)相关推荐

  1. python 是什么类型的语言-python到底是什么类型的语言

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. 解释型语言:(推荐学习:Python视频教程) 程序不需要编译,程序在运行时才翻译成机器语言,每执 行一次都要翻译一次.因此效率比 ...

  2. js date转string_JS之你到底是什么类型?

    我们都知道JS中包含两种数据类型:基本数据类型和引用数据类型. 基本数据类型:String.Number.Boolean.Null.Undefined.Symbol(ES6新增,表示独一无二的值) 引 ...

  3. python语音属于什么语言_python到底是什么类型的语言

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. 解释型语言:(推荐学习:Python视频教程) 程序不需要编译,程序在运行时才翻译成机器语言,每执 行一次都要翻译一次.因此效率比 ...

  4. python是什么类型的语言-python到底是什么类型的语言

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. 解释型语言:(推荐学习:Python视频教程) 程序不需要编译,程序在运行时才翻译成机器语言,每执 行一次都要翻译一次.因此效率比 ...

  5. 怎么确定迭代器后面还有至少两个值_为什么range不是迭代器?range到底是什么类型?

    迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代器的系列文章中(链接见文末),我至少提到了 23 种生成迭 ...

  6. String到底是值类型还是引用类型(C#)

    MSDN 中明确指出 String 是引用类型而不是值类型,但 String 表面上用起来却像是值类型,这又是什么原因呢?  首先从下面这个例子入手: //值类型int a = 1;int b = a ...

  7. 为什么range不是迭代器?range到底是什么类型?

    迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代器的系列文章中(链接见文末),我至少提到了 23 种生成迭 ...

  8. C语言的指针符号到底靠近变量类型还是变量名?

    今天在复习数据结构时,C语言实现线性表用到了指针,对指针符号的位置存疑,遂查询了一下: 在C语言中只要使用指针,必然用到* 运算符.然后经常会看到不同的书中*有靠近变量类型的,有靠近变量名称的,很迷惑 ...

  9. 为什么range不是迭代器?range到底是什么类型? 1

    迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代器的系列文章中(链接见文末),我至少提到了 23 种生成迭 ...

最新文章

  1. 触发Full GC执行的情况 以及其它补充信息
  2. 20071103网工考试
  3. php调用md5.js,PHP和JS实现HTTP上安全地传输密码
  4. 三级分类菜单的数据库设计
  5. 使用git管理自己的代码--简单使用流程
  6. MySQL实现类似Oracle的序列
  7. 机器人 知乎碧桂园_杨国强森林城市与机器人跃进后的“梦醒时分”
  8. 最全面测试计划书模板
  9. 驱动小黑的红点+中键TrackPoint
  10. PNETLAB模拟器汉化使用
  11. I'm just a baby——8月份英语总结
  12. C#实现计算机远程操作
  13. Spring如何用“声明式事务”保护亿万数据安全?【万字解决并发冲突】
  14. 【第五人格设计思路】囚徒“蝰”·时装设计思路
  15. 2022红帽RHCSA考题解析
  16. 有python专业的世界大学_2020年QS计算机专业排名进入世界前50的,除了G5,还有这所大学!...
  17. 鸟哥的Linux私房菜学习心得-基础操作
  18. CodeForces 786A Berzerk 博弈?BFS瞎搞
  19. UVA10820欧拉函数求互质的对数
  20. Oracle 函数使用:TABLE()

热门文章

  1. https.protocols的检测与设置
  2. 【计算机网络】网络体系结构
  3. 刻录方式--轨道一次刻录、光盘一次刻录区别
  4. [iOS]-Category、Extension和关联对象
  5. SAR成像系列:【9】合成孔径雷达(SAR)成像算法-波数域(omega-K)成像算法[也叫距离徙动(RM)算法](附Matlab代码)
  6. C++ DirectUI库 SoUI
  7. 超级实用!让你效率倍增的 6 款浏览器插件
  8. 【关于浏览器插件的安装和使用的教程】
  9. 增加字段sql,SQL语句增加列、修改列、删除列
  10. 将多个文件压缩成gzip,将gzip解压成多个文件