c - 为什么我可以在不包含 ctype.h 的情况下进行链接

标签 c gcc gcc4.9

  • 没有#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/

相关文章:

c++ - GCC 4.9 的 unordered_set 和 std::move

c++ - 模板转换函数到 const-reference

c - 从 C 中的 wav 文件中删除暂停

c - 通用求和宏和嵌套宏扩展

c - 当 strnlen() 的最大长度大于实际缓冲区大小时会发生什么?

正在编译 GCC NOP

c - 如何使用 scanf() 将数据读入 time_t 变量?

c - 链接描述文件中 *(.data)、*(.data*) 和 *(.data.*) 之间的区别

c++ - 版本 `CXXABI_1.3.8' 未找到(...需要)

c - 海合会 : division by zero