Python内置了大约50个函数。C语言的printf
和scanf
函数属于stdio.h
库。
C语言本身是否有任何函数?
C语言只有很少的关键字,但没有内置函数。每个你使用的函数都来自于其他库。即使没有标准库,也可以通过-nostdlib
标志(对于gcc)编译程序。
void foo(uint32_t u) { float f; memcpy(&f, &u, sizeof f); … }
中,编译器可能通过生成指令从整数寄存器移动数据到浮点寄存器来实现memcpy
,而不是调用任何外部的memcpy
例程。对于其他的memcpy
调用,它可能生成简单的指令来移动字节,并且不再调用外部例程。对于sqrt
,如果目标机器具有适当的平方根指令,它可能会生成一个平方根指令。printf("Hello, world.\n")
可以被实现为 puts("Hello, world.")
,执行函数而无需调用的指令(pow(x, 2)
可以被实现为将 x
乘以自身),或者结果可以通过内置于编译器的代码在编译时计算(sin(.3)
可能会在编译时计算)。printf()
和Java程序员使用System.out.println()
的方式之间仍存在根本性的差异。在许多环境中,C实现可能没有printf()
甚至没有malloc()
;但是Java JVM没有System.out
是不可想象的。C编译器可以与特定的标准库分离,在嵌入式系统中具有非常重要的意义。 - Kevin Booneprintf()
等都是“语言的一部分”。然而,C编译器不会生成实现这些函数的代码--它们应该以某种库的形式提供。大多数C编译器都知道库在哪里/是什么,并配置为自动链接它。如果您不想使用标准库,您几乎肯定可以告诉编译器/链接器不要这样做。有时候这样做是有好处的。String
和一个对象,编译器将生成调用对象的toString()
方法的代码。这个方法必须存在,因为Java语言和Java运行时库是密切相关的。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
仍然认为printf()
是“内置的”,尽管它不会为其生成代码。memcpy
和sqrt
通常会被替换为内联代码。 - Eric Postpischil
stdio.h
,则可以自由声明printf
和scanf
。在 C89 中,您甚至不需要声明它们。 - interjaydefined
,或者sizeof
和_Alignof
计算?也许是_Generic
?这些都是“表达式”,它取决于您如何定义“内置函数”。 - KamilCuksizeof
和类似的不是函数。sizeof
、_Alignof
和_Pragma
是运算符,而_Static_assert
则是声明。 - user694733