当我向gcc添加std=c99标志时,fileno、F_LOCK和F_ULOCK将变得未声明且不可用

当我向gcc添加std=c99标志时,fileno、F_LOCK和F_ULOCK将变得未声明且不可用,c,gcc,c99,C,Gcc,C99,我在c代码中有这些标题 #include <stdio.h> #include <unistd.h> #包括 #包括 在我将-std=c99标志添加到gcc命令(以启用)之前,一切都编译得很好。这引发了以下错误 警告:隐式声明 函数fileno 错误:F_锁未声明(首次使用 在该功能中) 错误:(每个未声明的标识符都是 仅报告一次错误: 对于每个功能,它都显示在。) 错误:F_ULOCK未声明(首次使用 在这个函数中 有没有解决这些错误/警告的方法?您需要告诉标题您想

我在c代码中有这些标题

#include <stdio.h>
#include <unistd.h>
#包括
#包括
在我将-std=c99标志添加到gcc命令(以启用)之前,一切都编译得很好。这引发了以下错误

警告:隐式声明 函数
fileno

错误:
F_锁
未声明(首次使用 在该功能中)
错误:(每个未声明的标识符都是 仅报告一次错误: 对于每个功能,它都显示在。)
错误:
F_ULOCK
未声明(首次使用 在这个函数中


有没有解决这些错误/警告的方法?

您需要告诉标题您想要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
或其他类似机制来实现相同的效果。

您可以尝试使用-D_BSD_SOURCE启用BSD isms,或者使用-D_SVID_SOURCE启用System-V isms

尝试

-std=gnu99

在MacOS X上使用
-D_DARWIN_C_SOURCE
;在Solaris上使用
-D_extensions__
;在Linux上使用
-D_GNU_SOURCE
;列表继续(不确定HP-UX和AIX上的等价物是什么,但它们几乎肯定存在)。