Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
libc包含不考虑源类型参数更改的保护 问题:_C_Libc - Fatal编程技术网

libc包含不考虑源类型参数更改的保护 问题:

libc包含不考虑源类型参数更改的保护 问题:,c,libc,C,Libc,如果我包括time.h,更改“源类型参数”并重新包括该标题,它不应该添加到这些新定义中吗?我知道这是因为包括警卫。我的问题是:这是libc中的一个bug吗?难道它不能处理这个问题吗 #include <time.h> #define _XOPEN_SOURCE 600 #include <time.h> static struct timespec t; 背景 在使用-std=c99编译时,我发现了构建Python扩展的这种行为。如果在包含Python.h之前先包含标

如果我包括
time.h
,更改“源类型参数”并重新包括该标题,它不应该添加到这些新定义中吗?我知道这是因为包括警卫。我的问题是:这是libc中的一个bug吗?难道它不能处理这个问题吗

#include <time.h>
#define _XOPEN_SOURCE 600
#include <time.h>

static struct timespec t;
背景 在使用
-std=c99
编译时,我发现了构建Python扩展的这种行为。如果在包含
Python.h
之前先包含标准库,则会由于缺少POSIX功能的定义而导致编译错误。如果我将
Python.h
include移到其他所有内容之前,一切都很好。当然,使用
-std=gnu99
编译也可以。但我想弄清错误发生的原因,并将其提炼为上面的代码示例

这就引出了另一个问题。如果上述行为不是bug,那么在头中设置
\u XOPEN\u SOURCE
和类似的源类型参数是否被认为是错误的做法?Python是否应该删除其标题中该参数的设置,而是要求用户在编译期间定义它,或者使用
std=gnu99

您所称的“源类型参数”称为功能测试宏,如果定义了标准标题,则在包含任何标准标题之前,特别要求对其进行定义

具体规定如下:

符合POSIX标准的应用程序应确保在包含任何标题之前定义了特性测试宏_POSIX_C_源

符合XSI的应用程序应确保在包含任何标题之前,使用值700定义特性测试宏_XOPEN_源

标准规范还明确规定了标准规范及其扩展规范的这一要求:

注意:为了有效,必须在包含任何头文件之前定义特性测试宏


您无法通过重新定义和重新包含标题来更改内容,事实上,在标题之间定义或取消定义/重新定义标题(即使是不同的、看似不相关的标题)可能会完全破坏内容。

“如果我包含time.h,请更改“source type参数”并重新包含该标题,它是否应该添加到这些新定义中?”,事实上恰恰相反。警卫在那里,这样你就不会再次申报了。所以“旧的”定义是保留下来的,它们不会被覆盖。这意味着它可能缺少Python文档。他们应该声明Python依赖于POSIX标准,扩展模块应该使用
-std=gnu99
-D\u XOPEN\u SOURCE
编译。我不认为这是Python文档的问题。如果您想使用
-std=c99
进行编译,但需要POSIX或其他功能,则需要使用FTMs来获得它。我认为这是在GCC中记录的。首选的方法是添加适当的
-D
,而不是编辑源。然后确保在包含任何标题之前定义了它。这是一个文档问题。我没有使用POSIX,Python是,它假设它在那里。因为没有其他文档说明,我认为使用C99和重新排序包含是可以接受的,但事实并非如此。我明白了。那么是的,Python应该记录您需要使用Python头/接口和适当的FTM来编译模块源代码,以使POSIX基线(或XSI,或任何其他)功能可用,并提到它们需要在文件顶部或通过
-D
定义。
example.c:5:24: error: storage size of ‘t’ isn’t known
    5 | static struct timespec t;
      |                        ^