【问题标题】:Truncate on Linux with c99使用 c99 在 Linux 上截断
【发布时间】:2020-10-04 11:53:18
【问题描述】:

我想打开一个文件并设置它的大小,这样我就可以使用 mmap 来写入它。 我发现我可以使用函数“truncate”/“ftruncate”。不幸的是,当我包含 时出现错误:

错误:函数“截断”的隐式声明

我在网上看到我应该使用 gnu 或类似的东西,但这是用于学校项目,我们必须使用 -std=c99 进行编译。

还有其他选择吗?

【问题讨论】:

  • 使用-std=gnu99也许没人注意到:)
  • 在命令行中添加-D_XOPEN_SOURCE=700,或在第一个系统#include之前添加等效的#define,以激活POSIX(和X/Open)功能。
  • @JonathanLeffler 很好发现,不过我猜仍然是一种解决方法。
  • 如果您想将 POSIX 函数与严格的符合标准的编译器一起使用,您应该这样做。使用-std=c99 使 GCC 成为更接近标准的编译器。使用-std=gnu99 可以有效地启用大量扩展,包括 POSIX 函数。另一种选择是显式声明truncate()

标签: c file truncate write


【解决方案1】:

当您使用-std=c99 时,C 库确保标头不声明任何未保留/未在 C 标准库中定义的符号。由于ftruncate不属于C标准库,而是POSIX扩展,所以默认没有定义。

为了获得最大的兼容性,POSIX 程序必须在包含标头之前使用适当的值 define the _POSIX_C_SOURCE feature test macro_XOPEN_SOURCE

特性测试宏在例如 Linux 手册页上很方便地列出;对于ftruncate,这些将是:

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

即使用

#define _XOPEN_SOURCE 500 // (or greater; current is 700)
#include <unistd.h>

#define _POSIX_C_SOURCE 200112L // (or greater) 
#include <unistd.h>

【讨论】:

    猜你喜欢
    • 2010-11-02
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2013-08-06
    • 2016-12-29
    • 1970-01-01
    • 2020-03-10
    • 2014-12-01
    相关资源
    最近更新 更多