【问题标题】:GCC returns error - 'implicit declaration of function 'truncate'' [duplicate]GCC返回错误-'函数'截断'的隐式声明'[重复]
【发布时间】:2016-10-19 12:14:59
【问题描述】:

在我的学校项目中,我们正在制作一个带有几个标志的复制程序。复制后我需要截断一个 infile。 这是它的代码:

int a_trunc(const char* infile, const char* size){
    int s = strtol(size, NULL, 10);
    truncate(infile, s);
    return 0;
}

GCC 返回错误:'函数'truncate'的隐式声明'。

我包含了 sys/types.h 和 unistd.h。

我正在使用标志进行编译: -std=c99 -Wall -Werror

感谢您的宝贵时间。

【问题讨论】:

  • 你试过用标志 -std=gnu99 编译吗?
  • 也可以试试 -std=c99 -D_GNU_SOURCE
  • 在“GNU 模式”-std=gnu90(这是 GCC 版本 5 的默认设置)下运行的 GCC 编译器会在标准库中转储各种非标准垃圾。 C 标准不允许这样做,因此当您告诉它将代码编译为标准 C 时,它会删除非标准垃圾。在这种情况下,它可能会删除太多。 POSIX 往往会与标准 C 发生冲突,这可能就是原因。

标签: c gcc


【解决方案1】:

您会得到它,因为在您尝试使用之前,truncate() 没有使用原型声明。

the man page:

概要

   #include <unistd.h>
   #include <sys/types.h>

   int truncate(const char *path, off_t length);
   int ftruncate(int fd, off_t length);

虽然您需要同时 #include unistd.hsys/types.h,但这还不够。 GCC/Linux 还需要特定的功能宏定义:

glibc 的功能测试宏要求(参见 feature_test_macros(7)):

   truncate():
       _XOPEN_SOURCE >= 500
           || /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
           || /* Glibc versions <= 2.19: */ _BSD_SOURCE

   ftruncate():
       _XOPEN_SOURCE >= 500
           || /* Since glibc 2.3.5: */ _POSIX_C_SOURCE >= 200112L
           || /* Glibc versions <= 2.19: */ _BSD_SOURCE

使用-std=c99 是获得这些的一种方法。

【讨论】:

  • 正如我所说,我将这两个都包括在内。如果我同时包含两个 .h 文件,为什么我必须声明一个原型?该程序中的所有其他功能都有效。只有截断会收到此错误。
  • 很好,但我不知道为什么……还是非常感谢
  • @Erik 把你所有的代码贴出来,也许就知道为什么了。
  • @Erik 解决方案是不要自己编写原型,这绝不是必要的。使用这些库时,您可能应该切换到 -std=gnu99。显然它们内部的某些东西与标准 C 相冲突。
  • 我今天很慢...
猜你喜欢
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
  • 2013-03-20
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
相关资源
最近更新 更多