为什么我可以使用isspace()而不包含所需的标头?

时间:2015-07-17 11:02:23

标签: c

为什么此代码有效:

    #include <stdio.h>

    int main()
    {
        int x = isspace(getchar());
        printf("%d", x);
        return 0;
    }

每当我输入空格isspace()返回8时,当我不输入时,它会给出0。

这不应该在编译时产生错误吗?我没有在顶部添加#include <ctype.h>。那么为什么允许这样做呢?

2 个答案:

答案 0 :(得分:5)

你看到了这个,因为你的编译器(遗憾地,仍然)支持函数的隐式声明。

如果启用严格检查,编译器应拒绝编译代码。在C99之上,隐式函数声明已经变为非标准。 (要添加,希望未来版本的编译器默认情况下严格禁止此操作。

答案 1 :(得分:1)

有时C标准库的特定实现将通过包含另一个标头来支持一个标头:在您的情况下,stdio.h可能包括 - 直接或间接 - isspace声明,它本身可能是直接的在ctype.hctype.h中包含的其他文件中。您可以通过执行预处理阶段来测试,例如......

gcc -E myprog.c | grep isspace

可能发生的另一件事是编译器硬编码常见函数的实现,比如说strlen,所以他们可以例如在字符串文字的编译时执行它。

尽管它“正常工作”,但理想情况下你可以直接包含你需要的头文件,所以如果另一个编译器/实现 - 或者它的后续版本 - 没有相同的怪癖,你的代码仍然会编译。 / p>