【问题标题】:Why am I able to use isspace() without including the required header? [duplicate]为什么我可以使用 isspace() 而不包含所需的标头? [复制]
【发布时间】:2015-07-17 11:02:22
【问题描述】:

为什么这段代码有效:

    #include <stdio.h>

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

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

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

【问题讨论】:

    标签: c


    【解决方案1】:

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

    如果您启用严格检查,您的编译器应该拒绝编译代码。在C99 及以上,隐式函数声明已非标准。 (希望未来的编译器版本默认会严格禁止这一点。

    【讨论】:

      【解决方案2】:

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

      gcc -E myprog.c | grep isspace
      

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

      尽管它“工作”,但理想情况下,您最好直接包含您需要的头文件,因此如果另一个编译器/实现 - 或相同的更高版本 - 没有相同的怪癖,您的代码仍然可以编译。

      【讨论】:

        猜你喜欢
        • 2010-12-13
        • 1970-01-01
        • 2023-01-18
        • 1970-01-01
        • 2020-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        相关资源
        最近更新 更多