当前位置:  开发笔记 > 编程语言 > 正文

C:为什么size_t不是C关键字?

如何解决《C:为什么size_t不是C关键字?》经验,为你挑选了4个好方法。

sizeof是一个C 关键字.它返回名为的类型的大小size_t.但是,size_t不是关键字,而是主要定义在stddef.h其他C标准头文件中.

考虑一种您想要创建包含任何C标准头文件或库的C程序的场景.(例如,如果你正在创建一个OS内核.)现在,在这样的代码中,sizeof可以使用(它是一个C关键字,所以它是语言的一部分),但它返回的类型(size_t)不是可以!

这不是C标准规范中的某种问题吗?你能澄清一下吗?



1> Simon Broadh..:

它不会返回size_t类型的值,因为size_t本身不是具体类型,而是未指定内置类型的typedef.Typedef标识符(例如size_t)完全等同于它们各自的底层类型(并在编译时转换为它们).如果size_t在您的平台上定义为unsigned int,则sizeof在您的系统上编译时返回unsigned int.size_t只是维护可移植性的一种方便方法,如果您按名称明确使用它,则只需要包含在stddef.h中.


+1,正确答案.任何返回typedef的东西都不能说是返回那个typedef.它返回typedef归结为的任何内容.如果您想要可移植性,请包含stddef.h.如果不这样做,请在您的平台上查找size_t的定义,并直接使用该类型.

2> Chris Lutz..:

sizeof是一个关键词,因为尽管它的名称和用途,这是一个运营商+=<而非功能类似printf()atoi()fgets().很多人忘记(或者只是不知道)sizeof实际上是一个操作符,并且始终在编译时而不是在运行时解析.

C语言不需要size_t是可用的,一致的语言.这只是标准库的一部分.C语言需要所有运营商.如果+C 代替使用关键字plus来添加数字,那么您将使其成为运算符.

此外,我做的半隐式重铸size_ts到unsigned intS(和定期intS,但Kernighan和Ritchie总有一天会杀我这个)所有的时间.sizeof如果你愿意,可以将a的返回类型分配给int,但在我的工作中,我通常只是将它直接传递给某个malloc()或类似的东西.


并非广泛使用(甚至支持),但对于C99样式的可变长度数组,sizeof在运行时进行评估.
@ChrisLutz从什么时候开始C99支持不足?这对我来说是新闻.这不是因为MSVC未能实施超过十年的标准,该标准支持不足......

3> DevSolar..:

来自C标准的一些头文件是针对独立环境定义的,即适合在例如操作系统内核中使用.它们没有定义任何函数,只定义和typedef.

它们是float.h,iso646.h,limits.h,stdarg.h,stdbool.h,stddef.h和stdint.h.

在使用操作系统时,从这些标头开始并不是一个坏主意.让它们可用会使内核中的许多事情变得更容易.特别是stdint.h会变得很方便(uint32_t等).



4> Jonathan Lef..:

这不是C标准规范中的某种问题吗?

查看C的托管实现与独立C实现之间的区别.需要独立(C99)实现来提供标头:

这些标题根本不定义任何函数.它们定义了某种程度上特定于编译器的语言部分(例如,offsetof宏中,以及变量参数列表宏和类型),但它们可以在不实际构建为完整关键字的语言的情况下进行处理.

这意味着即使在您的假设内核中,您也应该期望C编译器提供这些头和任何底层支持函数 - 即使您提供了其他所有内容.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有