为什么此代码有效:
#include <stdio.h>
int main()
{
int x = isspace(getchar());
printf("%d", x);
return 0;
}
每当我输入空格isspace()
返回8时,当我不输入时,它会给出0。
这不应该在编译时产生错误吗?我没有在顶部添加#include <ctype.h>
。那么为什么允许这样做呢?
答案 0 :(得分:5)
你看到了这个,因为你的编译器(遗憾地,仍然)支持函数的隐式声明。
如果启用严格检查,编译器应拒绝编译代码。在C99
之上,隐式函数声明已经变为非标准。 (要添加,希望未来版本的编译器默认情况下严格禁止此操作。)
答案 1 :(得分:1)
有时C标准库的特定实现将通过包含另一个标头来支持一个标头:在您的情况下,stdio.h可能包括 - 直接或间接 - isspace
声明,它本身可能是直接的在ctype.h
或ctype.h
中包含的其他文件中。您可以通过执行预处理阶段来测试,例如......
gcc -E myprog.c | grep isspace
可能发生的另一件事是编译器硬编码常见函数的实现,比如说strlen
,所以他们可以例如在字符串文字的编译时执行它。
尽管它“正常工作”,但理想情况下你可以直接包含你需要的头文件,所以如果另一个编译器/实现 - 或者它的后续版本 - 没有相同的怪癖,你的代码仍然会编译。 / p>