sizeof
是一个C 关键字.它返回名为的类型的大小size_t
.但是,size_t
它不是关键字,而是主要定义在stddef.h
其他C标准头文件中.
考虑一种您想要创建不包含任何C标准头文件或库的C程序的场景.(例如,如果你正在创建一个OS内核.)现在,在这样的代码中,sizeof
可以使用(它是一个C关键字,所以它是语言的一部分),但它返回的类型(size_t
)不是可以!
这不是C标准规范中的某种问题吗?你能澄清一下吗?
它不会返回size_t类型的值,因为size_t本身不是具体类型,而是未指定内置类型的typedef.Typedef标识符(例如size_t)完全等同于它们各自的底层类型(并在编译时转换为它们).如果size_t在您的平台上定义为unsigned int,则sizeof在您的系统上编译时返回unsigned int.size_t只是维护可移植性的一种方便方法,如果您按名称明确使用它,则只需要包含在stddef.h中.
sizeof
是一个关键词,因为尽管它的名称和用途,这是一个运营商像+
或=
或<
而非功能类似printf()
或atoi()
或fgets()
.很多人忘记(或者只是不知道)sizeof
实际上是一个操作符,并且始终在编译时而不是在运行时解析.
C语言不需要size_t
是可用的,一致的语言.这只是标准库的一部分.C语言需要所有运营商.如果+
C 代替使用关键字plus
来添加数字,那么您将使其成为运算符.
此外,我做的半隐式重铸size_t
s到unsigned int
S(和定期int
S,但Kernighan和Ritchie总有一天会杀我这个)所有的时间.sizeof
如果你愿意,可以将a的返回类型分配给int,但在我的工作中,我通常只是将它直接传递给某个malloc()
或类似的东西.
来自C标准的一些头文件是针对独立环境定义的,即适合在例如操作系统内核中使用.它们没有定义任何函数,只定义和typedef.
它们是float.h,iso646.h,limits.h,stdarg.h,stdbool.h,stddef.h和stdint.h.
在使用操作系统时,从这些标头开始并不是一个坏主意.让它们可用会使内核中的许多事情变得更容易.特别是stdint.h会变得很方便(uint32_t等).
这不是C标准规范中的某种问题吗?
查看C的托管实现与独立C实现之间的区别.需要独立(C99)实现来提供标头:
这些标题根本不定义任何函数.它们定义了某种程度上特定于编译器的语言部分(例如,offsetof
宏中
,以及变量参数列表宏和类型
),但它们可以在不实际构建为完整关键字的语言的情况下进行处理.
这意味着即使在您的假设内核中,您也应该期望C编译器提供这些头和任何底层支持函数 - 即使您提供了其他所有内容.