系统函数open():O_DIRECT的标志在我编译代码时未被清除

mlmc2os5  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(290)

但是当我添加#define _ _USE_GNU 1时,它工作了,我想知道为什么它工作了?为什么我只添加标题它不工作<fcntl.h>?我是Linux编程的入门者,在那里我可以学习这样的知识,非常感谢!
我添加了#define //#define __USE_GNU 1,它就可以工作了。
enter image description here

ozxc1zmp

ozxc1zmp1#

您正在使用的<fcntl.h>头文件被设计为与为不同标准编写的C源代码一起使用,这些标准可以在编译时选择。
POSIX标准没有指定O_DIRECT标识符,因此只为POSIX编写的源代码可以使用O_DIRECT标识符。如果<fcntl.h>定义了一个O_DIRECT标识符,那么当编译这个使用O_DIRECT的源代码时,它可能会导致错误,或者更糟的是,可能会导致程序运行不正确。为了避免这种情况,默认情况下,<fcntl.h>不定义O_DIRECT,它必须由程序请求。
GNU/Linux提供了POSIX标准之外的其他特性,包括O_DIRECT标识符。要使用这些功能,源代码应该在#include <fcntl.h>之前有#define _GNU_SOURCE。这个预处理器宏向<fcntl.h>指出,它应该提供GNU/Linux的附加特性,而不仅仅是POSIX特性。
头部使用预处理器条件指令(如#if)来选择它声明和定义的内容。当_GNU_SOURCE和其他功能测试宏没有定义时,它只声明和定义POSIX标准指定的功能。当定义了_GNU_SOURCE时,头部声明并定义了其他特性。
__USE_GNU是一个宏名,用于头文件中的内部使用。你不应该直接定义它。header检查各种指定的feature test macros,如_BSD_SOURCE_XOPEN_SOURCE_GNU_SOURCE,以确定要做什么,并且它们可能会设置内部宏,如__USE_GNU,作为管理决策的一部分。通过设置__USE_GNU,您似乎触发了O_DIRECT的定义。但是,您不应该使用该宏来执行此操作。仅使用文档中指定的功能测试宏。

相关问题