代码之家  ›  专栏  ›  技术社区  ›  Jobin

C有内置函数吗?

c
  •  1
  • Jobin  · 技术社区  · 4 年前

    Python中有大约50个内置函数。这个 printf scanf C的函数属于 stdio.h 图书馆。

    C中是否有任何函数是语言本身的一部分?

    0 回复  |  直到 4 年前
        1
  •  4
  •   aragaer    4 年前

    C有一些关键字,但没有内置函数。你使用的每个函数都来自其他库。即使没有标准库,也可以使用 -nostdlib 标志(用于gcc)。

        2
  •  1
  •   Kevin Boone    4 年前

    这取决于你所说的“语言的一部分”是什么意思。有一些规范定义了C标准库应该提供什么,因此在这方面 printf() 等等,都是“语言的一部分”。

    然而,C编译器不会生成实现这些函数的代码——它们应该在某种库中提供。大多数C编译器都知道库在哪里/什么,并将被配置为自动链接它。如果你不想使用标准库,你几乎可以肯定地告诉编译器/链接器不要这样做。有时有充分的理由。

    尽管有标准库的规范,但语言语法本身与库几乎没有耦合。例如,在Java中,如果你添加一个 String 对于一个对象,编译器将生成代码来调用该对象的 toString() 方法。这种方法必须存在,因为Java语言和Java运行时库密切相关。

    在C中没有真正等效的过程——C编译器可以在完全不知道可能有哪些函数可用的情况下生成代码。这些函数确实需要在运行时之前可用,但这实际上是链接器的工作,而不是编译器的工作。

    然而, gcc 至少 有“内置”函数的概念。例如,如果我尝试编译这个:

    void printf (void)
      {
      }
    

    我收到一个警告:

    test.c:1:6: warning: conflicting types for built-in function 
    ‘printf’; expected ‘int(const char *, ...)’ [-Wbuiltin-
     declaration-mismatch]
    

    即使我使用 -nostdlib 开关。即使没有标准库, gcc 仍然想着 输出函数 尽管它不会为其生成代码,但它是“内置的”。

    我想“内置函数”的概念并不完全明确。

        3
  •  1
  •   Eric Postpischil    4 年前

    所有C标准库函数都内置在语言中,它们是C标准定义的C语言的一部分。C实现(特别是编译器)可以将这些函数实现为由编译器实现的内置函数或由链接器链接的对象模块。C标准在很大程度上将说明C程序必须如何行为的规则与关于C程序必须怎样实现的规则分开。

    从C程序必须如何表现的意义上讲,内置函数和链接函数之间没有区别:函数的行为是相同的,并且无法描述这两个实现之间可观察到的差异。

    编译器通常使用内置实现和链接实现的组合。例如,在 void foo(uint32_t u) { float f; memcpy(&f, &u, sizeof f); … } ,编译器可以实现 memcpy 通过生成将数据从整数寄存器移动到浮点寄存器的指令,而不是调用任何外部 memcpy 常规。对于其他 memcpy 调用时,它可能会生成移动字节的简单指令,而不会调用外部例程。For sqrt ,如果目标机器有合适的平方根指令,它可能会生成平方根指令。

    更复杂的函数通常是通过调用编译后链接到程序中的外部函数来实现的。即使有许多这样的情况,编译器也可以识别特殊情况并提供对替代函数的调用( printf("Hello, world.\n") 可以像 puts("Hello, world.") ,无需调用即可执行函数的指令( pow(x, 2) 可以实现为 x 其本身),或者可以在编译时通过编译器内置的代码计算结果( sin(.3) 可能在编译时进行评估)。