查询O_NOATIME声明的权威文档及编译报错合规解决方案
O_NOATIME宏声明的权威文档依据
问题背景
在Ubuntu 16.04(内核4.15)环境下编译以下SSCCE代码:
// defines and include needed according to openat manpage at man7.org #define _POSIX_C_SOURCE 200809L #define _ATFILE_SOURCE #include <sys/types.h> // additional include according to die.net , but not man7.org #include <sys/stat.h> // additional include according to die.net , but not man7.org #include <fcntl.h> int main() { openat(3, "foobar", O_NOATIME, 0); }
编译时报错:
error: ‘O_NOATIME’ undeclared
需获取O_NOATIME声明位置的权威文档依据,用于多系统兼容代码的合规参考,无需本地头文件路径提示。
权威文档说明
man7.org 官方说明:
O_NOATIME是Linux特有的扩展标志,声明于
<fcntl.h>中,但必须定义_GNU_SOURCE宏才能暴露该标志——仅定义_POSIX_C_SOURCE或_ATFILE_SOURCE无法触发其声明。在openat的man页面中,O_NOATIME被明确标注为Linux扩展特性,头文件依赖部分说明:需包含<fcntl.h>,且需通过_GNU_SOURCE启用Linux扩展宏。die.net 补充说明:
针对Linux系统,die.net的
openat文档同样指出,O_NOATIME属于Linux专属扩展,必须定义_GNU_SOURCE宏,才能在<fcntl.h>中获取该宏的声明。
多系统兼容代码调整依据
若要保证代码跨系统兼容性,可通过条件编译实现:
#ifdef __linux__ #define _GNU_SOURCE #endif #define _POSIX_C_SOURCE 200809L #define _ATFILE_SOURCE #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main() { #ifdef O_NOATIME openat(3, "foobar", O_NOATIME, 0); #endif }
该写法既遵循Linux权威文档的宏定义要求,又能在不支持O_NOATIME的系统中跳过相关代码,保证兼容性。
内容的提问来源于stack exchange,提问作者Mark Galeck
相关产品推荐
相关产品推荐

