代码之家  ›  专栏  ›  技术社区  ›  Ashwin Nanjappa

C:为什么“大小”不是C关键字?

  •  26
  • Ashwin Nanjappa  · 技术社区  · 16 年前

    sizeof 是C 关键字 . 它返回名为 size_t . 然而, 西泽特 关键字,但主要在中定义 stddef.h 可能还有其他C标准头文件。

    考虑一个场景,您希望创建一个C程序, 包括任何C标准头或库。(例如,如果您正在创建操作系统内核)现在,在这种代码中, 西泽 可以使用(它是C关键字,因此它是 语言 ,但它返回的类型( 西泽特 )不可用!

    这不意味着C标准规范中存在某种问题吗?你能澄清一下吗?

    10 回复  |  直到 12 年前
        1
  •  45
  •   Simon Broadhead    16 年前

    它不会从字面上返回类型大小为t的值,因为大小本身不是具体类型,而是未指定内置类型的typedef。typedef标识符(如size_t)完全等同于它们各自的基础类型(并在编译时转换为基础类型)。如果在您的平台上将size_t定义为无符号int,那么在系统上编译时sizeof将返回无符号int。大小t只是维护可移植性的一种简便方法,如果您明确使用它的名称,那么它只需要包含在stddef.h中。

        2
  •  14
  •   Chris Lutz    16 年前

    sizeof 是一个关键字,因为尽管它的名称和用法, 操作人员 喜欢 + = < 而不是 功能 喜欢 printf() atoi() fgets() . 很多人忘记了(或者只是不知道) 西泽 实际上是一个运算符,并且 总是 在编译时而不是运行时解析。

    C语言不需要 size_t 成为一种有用的、一致的语言。这只是标准库的一部分。C语言需要所有的操作符。如果,而不是 + ,c使用关键字 plus 要添加数字,您可以使其成为一个运算符。

    另外,我做了半隐式重铸 西泽特 S to unsigned int S(规则) int 但是克尼根和里奇总有一天会为此痛扁我。您可以指定返回类型 西泽 如果你愿意的话,我可以直接把它传给 malloc() 或者什么的。

        3
  •  8
  •   DevSolar    16 年前

    C标准中的某些标题是为 独立的 环境,即适合在操作系统内核中使用。它们不定义任何函数,只定义和typedef。

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

    在操作系统上工作时,从 这些 标题。让它们可用使内核中的许多事情变得更容易。尤其是stdint.h将变得方便(uint32_t等人)。

        4
  •  7
  •   Jonathan Leffler    16 年前

    这不意味着C标准规范中存在某种问题吗?

    查找C的宿主实现和独立的C实现之间的区别。独立(C99)实现需要提供头部:

    • <float.h>
    • <iso646.h>
    • <limits.h>
    • <stdarg.h>
    • <stdbool.h>
    • <stddef.h>
    • <stdint.h>

    这些头根本不定义任何函数。它们定义了某种特定于编译器的语言部分(例如, offsetof 宏在 <STDDEF.H> 和变量参数列出宏和类型 <StDARG.H> ,但它们可以在不将其作为完整关键字内置到语言中的情况下进行处理。

    这意味着,即使在假设的内核中,您也应该期望C编译器提供这些头文件和任何底层支持函数——即使您提供了其他一切。

        5
  •  4
  •   Michael Burr    16 年前

    我认为主要原因是 size_t 不是关键字是:

    • 没有令人信服的理由。C语言和C++语言的设计者总是希望在可能的和合理的情况下在库中实现语言特征。
    • 向语言中添加关键字可能会对现有的遗留代码体造成问题。这也是他们通常拒绝添加新关键字的另一个原因。

    例如,在讨论C++标准的下一个主要修订时, Stroustrup had this to say :

    C++0X的改进应该以这样一种方式来完成,使所得到的语言更容易学习和使用。委员会的经验法则包括:

    ...

    • 比起语言扩展,更喜欢标准的图书馆设施

        6
  •  3
  •   anon    16 年前

    没有理由不包括stddef.h,即使您正在开发内核——它为您的特定编译器定义任何代码都需要的类型大小。

    还要注意,几乎所有的C编译器都是自编译的。因此,sizeof运算符的实际编译器代码将使用size_t并引用与用户代码相同的stddef.h文件。

        7
  •  2
  •   schnaader    16 年前

    MSDN :

    应用sizeof运算符时 对于char类型的对象,它将生成1

    即使您没有stddef.h可用/包含,也不知道大小,使用size of可以获得对象相对于char的大小。

        8
  •  2
  •   Anthony    16 年前

    size of实际上是一个类型-通常是一个无符号整数。size of是一个提供类型大小的运算符。sizeof返回的类型实际上是特定于实现的,而不是C标准。它只是一个整数。

    编辑: 要非常清楚,使用sizeof不需要大小类型。我想你要找的答案是——是的,不一致。然而, 没关系。 实际上,您仍然可以正确使用sizeof,而无需从头文件中定义大小。

        9
  •  1
  •   Unknown    16 年前

    西泽特 不是必需的关键字。对于整体类型,不同的架构通常具有不同的大小。例如,64位计算机可能具有 无符号长整型 作为 西泽特 如果他们不决定 int 64位数据类型。

    如果您将内置类型的sizeof设置为编译器,那么它将失去进行交叉编译的能力。

    也, 西泽 更像是一个魔术编译时宏(思考C++模板),它解释了为什么它是关键字而不是定义的类型。

        10
  •  1
  •   dirkgently    16 年前

    原因很简单,因为它不是基本类型。如果查找C标准,您会发现基本类型包括 int , char 等而不 size_t . 为什么呢?正如其他人已经指出的那样, 西泽特 是一种特定于实现的类型(即能够以任何对象的“c字节”数保持大小的类型)。

    另一方面, sizeof 是(一元)运算符。所有运算符都是关键字。