如果我包含time.h,请更改“源类型参数”并重新包含该标头,它是否不应该在这些新定义中添加?我了解这是由于包括警卫而发生的。我的问题是:这是libc中的错误吗?它不应该能够处理吗?
#include <time.h>
#define _XOPEN_SOURCE 600
#include <time.h>
static struct timespec t;
Run Code Online (Sandbox Code Playgroud)
错误信息:
example.c:5:24: error: storage size of ‘t’ isn’t known
5 | static struct timespec t;
| ^
Run Code Online (Sandbox Code Playgroud)
我发现这种行为在使用编译时构建了Python扩展-std=c99。如果在包含标准库之前包含标准库,Python.h由于缺少POSIX功能的定义,将会出现编译错误。如果我将Python.hinclude 放在所有其他内容之前,那么一切都很好。当然也可以进行编译-std=gnu99。但是我想深入了解为什么发生错误,并将其提炼为上述代码示例。
这就引出了另一个问题。如果上述行为不是错误,那么_XOPEN_SOURCE在标头中设置和类似的源类型参数是否被视为不良做法?Python是否应该在其标头中删除该参数的设置,而是要求用户在编译期间进行定义或使用std=gnu99?
您所谓的“源类型参数”称为功能测试宏,并且明确要求在包含任何标准标头之前就对其进行定义(如果已定义)。
这在XSH 2.2.1 POSIX.1符号中指定:
符合POSIX的应用程序应确保在包含任何报头之前已定义功能测试宏_POSIX_C_SOURCE。
...
符合XSI的应用程序应确保在包含任何报头之前,将功能测试宏_XOPEN_SOURCE定义为值700。
在为Linux手册页feature-test-macros还明确规定了通用的标准及其扩展这个要求:
注意:为了有效,必须在包含任何头文件之前定义功能测试宏
您无法重新定义和重新包含标头来更改内容,实际上,在标头(甚至不同的,看似无关的标头)之间定义或取消定义/重新定义标头可能会完全破坏事情。
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |