Ответ 1
Это цепочка последствий предварительной обработки и GNU C против C99.
Сначала, net/if.h
:
-
net/if.h
включаетfeatures.h
- В дальнейшем он определяет
struct ifreq
внутри блока#ifdef __USE_MISC
.
Итак:
- Что такое
__USE_MISC
? - это обычное явление для BSD и System V - Определяется ли это на этом этапе? - Нам нужно проверить это в
features.h
Итак, теперь features.h
:
- Когда вы используете
--std=c99
GCC по умолчанию определяет__STRICT_ANSI__
(так как это означает, что C99) - При предварительной обработке
features.h
, когда__STRICT_ANSI__
включен, функции BSD и System V не срабатывают, т.е.__USE_MISC
остается undefined.
Резервное копирование до net/if.h
: struct ifreq
даже не существует после предварительной обработки! Поэтому жалоба на размер хранилища.
Вы можете поймать всю историю, выполнив:
vimdiff <(cpp test.c --std=c99 -dD) <(cpp test.c --std=gnu99 -dD)
или иначе их отличить (например, diff --side-by-side
) вместо vimdiff
.