标题:有关 size_t 的定义
只看楼主
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:705
专家分:2043
注 册:2010-11-11
结帖率:96.55%
已结贴  问题点数:20 回复次数:6 
有关 size_t 的定义
最近在整理有关c标准库的文档,遇到了一个问题:size_t到底时个什么东西?因为很多地方都在用这个东西,如果没有搞清楚的话自己用着总感觉不踏实。

首先,打开c11的标准看了看,里面有这样两短话
第一段:
size_t
which is the unsigned integer type of the result of the sizeof operator;

第二段:
the types used for size_t and ptrdiff_t should not have an integer conversion rank greater than that of signed long int unless the implementation supports objects large enough to make this necessary.

由此可以确定的两点时
1、size_t时个无符号整型
2、size_t最多是个signed long int

之后,我去我本机找并没有在stddef.h这个头文件中找到直接的定义,可能在别的文件里定义,没有找到。(我的环境时linux + gcc)

之后,我谢了这两句代码
printf("%zd\n",sizeof(size_t));

执行结果是8
我猜测在我本机上size_t应该时被定义成了unsigned long了。
不知道搞对了没有,希望之前关注过这个问题的朋友看看是否是这样。
也请用Visual Studio的朋友帮我找找看相关的头文件里面是如何定义的。
谢谢!
搜索更多相关主题的帖子: conversion necessary objects result should 
2014-12-05 20:14
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:20 
不对 我说错了 好像有这个文件。。


[ 本帖最后由 zklhp 于 2014-12-5 20:22 编辑 ]
2014-12-05 20:18
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:705
专家分:2043
注 册:2010-11-11
得分:0 
回复 2 楼 zklhp
相关的头文件绝对是有,否则程序无法编译啊。
可能时我没找对文件。
2014-12-05 20:29
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
在C中才需要头文件stddef.h,在C++中可在cstddef找到。不包含任何头文件,也可以使用size_t类型——其实很多人强调头文件的包含在一定程度上是多余的,有些数据类型和定义,不明确指出包含头文件也能用,因为编译器自己会包含它们,与以前tc/bc不包含stdio.h也能用一样,只不过有些编译器默认包含这些,有些默认包含那些,并不完全一样而已,实践的过程,无非是写的时候,(智能感应)编辑器提示没定义(红色波浪线)时,就返回头包含一下,如果没提示,照用可也,无需纠结(当然,有些人拒绝用IDE玩高深,自找麻烦,遇到编译不通过,辛苦一下罢了)。


[ 本帖最后由 TonyDeng 于 2014-12-11 13:35 编辑 ]

授人以渔,不授人以鱼。
2014-12-11 10:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
size_t是根据机器类型变化的,而编译时用什么,取决于编译参数,编译器会在运行(编译)的机器上自动检测机器类型,给出对应的定义进行编译。这跟sizeof()检测int的机制一样,都是在编译时确定的——sizeof()实际上不是函数,不在运行时执行。

授人以渔,不授人以鱼。
2014-12-11 13:27
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:705
专家分:2043
注 册:2010-11-11
得分:0 
回复 5楼 TonyDeng
我现在已经不细究类似的这种问题了。
现在感觉自己之前学C语言陷入了一种误区,总想打破砂锅问到底。C语言虽然有标准,但在具体实现的时候并不总是统一的。也就是说,C语言给了编译器一定的自由空间,自己决定一些事情。比如EOF这个东东,以前的时候总以为是-1,有时候看到别人写代码的时候也会用-1来代替。但后来才发现EOF才是C标准真正有的东西,而EOF到底是何值并没有说清楚,就算费力地搞清楚,也是毫无意义的。
2014-12-11 15:40
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
以下是引用八画小子在2014-12-11 15:40:46的发言:

我现在已经不细究类似的这种问题了。
现在感觉自己之前学C语言陷入了一种误区,总想打破砂锅问到底。C语言虽然有标准,但在具体实现的时候并不总是统一的。也就是说,C语言给了编译器一定的自由空间,自己决定一些事情。比如EOF这个东东,以前的时候总以为是-1,有时候看到别人写代码的时候也会用-1来代替。但后来才发现EOF才是C标准真正有的东西,而EOF到底是何值并没有说清楚,就算费力地搞清楚,也是毫无意义的。

+10086
2014-12-11 15:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-439624-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.592828 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved