Sim*_*ead 45
它不会返回size_t类型的值,因为size_t本身不是具体类型,而是未指定内置类型的typedef.Typedef标识符(例如size_t)完全等同于它们各自的底层类型(并在编译时转换为它们).如果size_t在您的平台上定义为unsigned int,则sizeof在您的系统上编译时返回unsigned int.size_t只是维护可移植性的一种方便方法,如果您按名称明确使用它,则只需要包含在stddef.h中.
Chr*_*utz 14
sizeof是一个关键词,因为尽管它的名称和用途,这是一个运营商像+或=或<而非功能类似printf()或atoi()或fgets().很多人忘记(或者只是不知道)sizeof实际上是一个操作符,并且始终在编译时而不是在运行时解析.
C语言不需要size_t是可用的,一致的语言.这只是标准库的一部分.C语言需要所有运营商.如果+C 代替使用关键字plus来添加数字,那么您将使其成为运算符.
此外,我做的半隐式重铸size_ts到unsigned intS(和定期intS,但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)实现来提供标头:
<float.h><iso646.h><limits.h><stdarg.h><stdbool.h><stddef.h><stdint.h>这些标题根本不定义任何函数.它们定义了某种程度上特定于编译器的语言部分(例如,offsetof宏中<stddef.h>,以及变量参数列表宏和类型<stdarg.h>),但它们可以在不实际构建为完整关键字的语言的情况下进行处理.
这意味着即使在您的假设内核中,您也应该期望C编译器提供这些头和任何底层支持函数 - 即使您提供了其他所有内容.