GNU中是否有任何默认头文件

时间:2013-11-25 20:03:33

标签: c

当我浏览代码片段时,我看到了一些像

这样的函数
#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.

请不要介意函数的语法是否错误,因为这不是重点。

2 个答案:

答案 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这样的标准库,但维基百科清楚地说明了其他的东西,现在我完全糊涂了。