- 没有
#include<ctype.h>
,下面的程序输出1和0。 - 通过包含,它输出 1 和 1。
我正在使用 TDM-GCC 4.9.2 64 位。我想知道 isdigit
的执行情况是第一种情况,为什么能链接。
#include<stdio.h>
//#include<ctype.h>
int main()
{
printf("%d %d\n",isdigit(48),isdigit(48.4));
return 0;
}
最佳答案
默认情况下,GCC 使用允许隐式声明的 C90 标准(带有 GNU 扩展 ( reference ))。你的案例的问题是你有两次调用 isdigit
有两个不同的参数,这可能会使编译器在创建函数的隐式声明时感到困惑,并且它可能会选择 int isdigit(double)
。为了安全起见。这当然是函数的错误原型(prototype),这意味着当在运行时调用库函数时,它将使用错误的参数调用,并且您将有未定义的行为。
当您包含 <ctype.h>
时头文件,有一个正确的原型(prototype),然后编译器知道 isdigit
需要 int
参数并可以转换 double
文字 48.4
到整数 48
电话。
至于为什么要链接,是因为虽然这些函数可以实现为宏,但这不是必需的。 的要求是那些函数,至少在 C11 标准中(我目前没有任何旧版本可用)必须知道当前的语言环境,这将使它们的实现与普通库函数一样,宏更难,也更容易。由于标准库始终处于链接状态(除非您以其他方式告诉 GCC),因此这些函数将可用。
关于c - 为什么我可以在不包含 ctype.h 的情况下进行链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33756958/