但是当我添加#define _ _USE_GNU 1时,它工作了,我想知道为什么它工作了?为什么我只添加标题它不工作<fcntl.h>?我是Linux编程的入门者,在那里我可以学习这样的知识,非常感谢!
我添加了#define //#define __USE_GNU 1,它就可以工作了。
enter image description here
但是当我添加#define _ _USE_GNU 1时,它工作了,我想知道为什么它工作了?为什么我只添加标题它不工作<fcntl.h>?我是Linux编程的入门者,在那里我可以学习这样的知识,非常感谢!
我添加了#define //#define __USE_GNU 1,它就可以工作了。
enter image description here
1条答案
按热度按时间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
的定义。但是,您不应该使用该宏来执行此操作。仅使用文档中指定的功能测试宏。