Вопрос
Если я включу 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;
| ^
Фон
Я обнаружил это поведение при создании расширения Python при компиляции с -std=c99
. Если бы я включил стандартные библиотеки до того, как включил Python.h
, я получил бы ошибки компиляции из-за отсутствия определений функциональности POSIX. Если бы я переместил Python.h
, прежде чем все остальное, все было в порядке. Конечно, компиляция с -std=gnu99
также работает. Но я хотел понять причину возникновения ошибки и перевести ее на приведенный выше пример кода.
Что вызывает другой вопрос. Если приведенное выше поведение не является ошибкой, считается ли установка _XOPEN_SOURCE
и подобные параметры типа источника в заголовке плохой практикой? Должен ли Python удалить настройку этого параметра в своих заголовках и вместо этого потребовать, чтобы пользователи определяли его во время компиляции, или использовать std=gnu99
?