LINUX.ORG.RU

Чё за чёрная магия с заголовочниками в си?

 , ,


0

1

И так.

Есть заголовочник без ограничения общности delay.h и цэщник к нему.

Используются типы из stdint в объявлении и определении функций, при этом в цешник stdint.h подтягивается через другой заголовочный файл.

А в ашнике инклудов вообще нет.

И всё работает.

Как такое вообще возможно?


fsb4000 спасибо, про порядок запамятовал.



Последнее исправление: nikitalol (всего исправлений: 3)

Заголовочный файл не обязан быть компилируем.

Должен быть компилируем только исходный файл.

И это работает потому что #include <stdint.h> стоит выше чем твой #include, и когда препроцессор всё подставит получится валидный с файл.

fsb4000 ★★★★★
()

#include - это просто текстовая подстановка. Чтобы увидеть код, который на самом деле попадает в компилятор, нужно посмотреть результаты препроцессинга (у gcc это ключ -E)

annulen ★★★★★
()

есть три текстовых файла A, B, C.

если подставить A в B, а потом подставить В в С, то это то же самое что подставить A и B в C. include, это просто текстовая вставка. полностью эквивалентная copy/paste

alysnix ★★★
()

Ну так всё это будет работать до того момента, пока везде в коде.

// XXX.c
#include <stdint.h>
...
#include <delay.h>

Но стоит появиться

// YYY.c
#include <delay.h>
...
#include <stdint.h>

и всё навернётся.

И не дай бог, ещё clang-format отсортирует заголовочные файлы.

Работает, т.к. препроцессор компилятора вместо всех include вставит содержимое соответствующих файлов разом. И только потом перейдёт к следующему шагу разбора.

AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

Ну так всё это будет работать до того момента, пока везде в коде…

Естественно. Хорошо написанный хидер позволяет себя включать несколько раз и даже в произвольном порядке. Плохо написанный хидер требует различных танцев с бубном. Чем дальше в лес, тем больше в либах херовых хидеров.

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

Естественно. Хорошо написанный хидер позволяет себя включать несколько раз и даже в произвольном порядке. Плохо написанный хидер требует различных танцев с бубном. Чем дальше в лес, тем больше в либах херовых хидеров.

Ты про include guard и подобное, или наоборот про то, что они - плохо?

GFORGX ★★★
()
Ответ на: комментарий от GFORGX

Про них но не только. С директивами условной компиляции можно много всего наворотить.

Они не то что хорошо/плохо - но они должны быть. Вот когда их нет, как в некоторых частях Image Magick например, вот тогда это плохо…

AntonI ★★★★★
()
Ответ на: комментарий от GFORGX

А он вроде достаточно умный, не?

Зависит от настроек IncludeBlocks, IncludeCategories (см. https://clang.llvm.org/docs/ClangFormatStyleOptions.html#includeblocks).

Я использую стиль google

Далеко не все его используют.

LLVM предлагает размещать системные библиотеки в низ списка: https://llvm.org/docs/CodingStandards.html#include-style

AlexVR ★★★★★
()