【问题标题】:fileno, F_LOCK and F_ULOCK become undeclared and unavailable when I add std=c99 flag to gcc当我将 std=c99 标志添加到 gcc 时,fileno、F_LOCK 和 F_ULOCK 变得未声明且不可用
【发布时间】:2010-11-28 05:37:31
【问题描述】:

我在 c 代码中有这些标头

#include <stdio.h>
#include <unistd.h>

在我将 -std=c99 标志添加到 gcc 命令(启用restrict)之前,一切都编译得很好。这触发了以下错误。

警告:隐式声明 函数fileno

错误:F_LOCK 未声明(首次使用 在这个函数中)
错误:(每个未声明的标识符都是 只报过一次错误: 对于它出现的每个函数。)
错误:F_ULOCK 未声明(首次使用 在这个函数中

有解决这些错误/警告的想法吗?

【问题讨论】:

    标签: c gcc c99


    【解决方案1】:

    您需要告诉标头您需要 POSIX 扩展。这些天,我使用:

    #if __STDC_VERSION__ >= 199901L
    #define _XOPEN_SOURCE 600
    #else
    #define _XOPEN_SOURCE 500
    #endif /* __STDC_VERSION__ */
    

    如果我使用-std=c89 进行编译,它会给出正确的 POSIX 版本;如果你用-std=c89 编译,它会给出正确的 POSIX 版本。我在 Solaris 9 和 10、MacOS X(10.4.x、10.5.x)、HP-UX 11.x、Linux(RHEL4 和 5、SuSE 9 和 10)以及 AIX 5.x 和 6.x 上使用它 - AFAICR ,到目前为止没有问题。

    这节应该出现在包含任何系统头文件之前(在您自己的头文件中,或在每个源文件中),或者您需要在编译器命令行上使用-D_XOPEN_SOURCE=600 或其他类似机制来达到相同的效果。

    【讨论】:

      【解决方案2】:

      试试

      -std=gnu99
      

      启用所有扩展并仍然使用 C99 语言增强功能。

      【讨论】:

        【解决方案3】:

        您可以尝试 -D_BSD_SOURCE 来启用 BSD-isms 或 -D_SVID_SOURCE 来启用 System-Visms

        【讨论】:

        • 在 MacOS X 上使用-D_DARWIN_C_SOURCE-D__EXTENSIONS__ 在 Solaris 上; -D_GNU_SOURCE 在 Linux 上;并且列表还在继续(不确定 HP-UX 和 AIX 上的等价物是什么,但几乎可以肯定它们存在)。
        猜你喜欢
        • 2017-11-27
        • 1970-01-01
        • 2011-01-12
        • 2012-11-17
        • 1970-01-01
        • 2012-08-15
        • 2012-02-28
        • 2011-07-04
        • 1970-01-01
        相关资源
        最近更新 更多