【发布时间】:2019-10-22 13:52:36
【问题描述】:
问题
如果我包含time.h,更改“源类型参数”并重新包含该标题,它不应该添加这些新定义吗?我知道这是由于包括警卫而发生的。我的问题是:这是 libc 中的错误吗?它不应该能够处理吗?
#include <time.h>
#define _XOPEN_SOURCE 600
#include <time.h>
static struct timespec t;
错误信息:
example.c:5:24: error: storage size of ‘t’ isn’t known
5 | static struct timespec t;
| ^
背景
我在使用 -std=c99 编译时发现了这种构建 Python 扩展的行为。如果我在包含 Python.h 之前包含标准库,我会因为缺少 POSIX 功能的定义而出现编译错误。如果我将Python.h 包含在其他所有内容之前,一切都很好。当然,使用-std=gnu99 编译也可以。但我想深入了解错误发生的原因,并将其提炼为上述代码示例。
这引出了另一个问题。如果上述行为不是错误,那么在标头中设置 _XOPEN_SOURCE 和类似的源类型参数是否被认为是不好的做法? Python 是否应该在其标头中删除该参数的设置,而是要求用户在编译期间定义它,还是使用std=gnu99?
【问题讨论】:
-
“如果我包含 time.h,更改“源类型参数”并重新包含该标头,它不应该添加到那些新定义中吗?” 不,实际上恰恰相反。守卫在那里,所以你不会第二次宣布什么。因此,“旧”定义会保留下来,不会被覆盖。