libc включает средства защиты, не учитывающие изменения параметров типа источника - PullRequest
4 голосов
/ 22 октября 2019

Вопрос

Если я включу 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?

...