当我浏览代码片段时,我看到了一些像
这样的函数#include <stdio.h>
int main() {
printf( "Upper case of a is %c\n", toupper('a'));
printf( "Upper case of 9 is %c\n", toupper('9'));
printf( "Upper case of g is %c\n", toupper('g'));
return 0;
}
在源文件中使用,不包含任何头文件。 那么编译时是否有任何默认的头文件被添加到源代码中。我正在使用GNU C.
请不要介意函数的语法是否错误,因为这不是重点。
答案 0 :(得分:4)
不,没有隐含的#include
指令。
您可能遇到的问题是,在1999 ISO C标准之前,C允许的函数在没有可见声明的情况下被调用。编译器会假设被调用函数返回int
并且接受与调用中传递的(提升的)参数兼容的参数。
默认情况下,gcc支持1990 ISO C标准和GNU特定扩展。
如果使用gcc -std=c99 -pedantic
之类的东西进行编译,则会收到有关没有可见声明的函数调用的警告。 (如果您还需要特定于GNU的扩展,请使用-std=gnu99
。)
即使在1999年标准之前,调用未声明的函数也是一个坏主意。您应该更正您的代码,以便为您调用或以其他方式引用的每个函数提供可见的声明(可能通过适当标头的#include
)。
您的原始问题询问toUppercase
,这不是标准函数;它可能会或可能不会在其他地方定义。
您修改后的问题使用toupper
,这是<ctype.h>
中声明的标准C函数,在标准C库中定义。
毫无疑问,你可以在没有明显声明的情况下调用toupper
,但你还是应该添加
#include <ctype.h>
到源文件的顶部。
在此之前,请尝试使用gcc -std=c99
进行编译;你应该收到警告。
还有一件事:请务必记住标题和库是两回事。
标题,如<stdio.h>
和<stdlib.h>
,通常是文本文件,只包含声明的函数和C标准库指定的其他实体。
Libraries ,具有特定于系统的名称,例如libc.so
,包含实现这些函数的实际可执行代码。
标头由编译器处理;库由链接器处理。
通常没有默认标头;您使用的每个标头必须直接或间接显式#include
d。 libc.so
(或其任何名称)通常默认链接;你不必指定它。 (虽然对于<math.h>
中声明的函数,您经常需要指定-lm
来链接相应的库。)
答案 1 :(得分:0)
由于论坛的人要求不要在评论中讨论,所以除了回复“Keith Thompson”上一篇文章之外别无其他选择。我不确定你的标准库是什么意思。看这里 C standard library
它清楚地说27个头文件是标准库的一部分,而stdlib.h就是其中之一。看到我的观点是不要和你争论。我想要清楚明白。你说像libc.so这样的标准库,但维基百科清楚地说明了其他的东西,现在我完全糊涂了。