2015-06-27 3 views
0

Я собираюсь разобраться с компилятором прямо сейчас, и я хочу убедиться, что проблема не является фундаментальным непониманием того, как заголовочные файлы. Если я включаю заголовочный файл и этот заголовочный файл содержит в нем (например, <stdbool.h> или <stdio.h> и т. Д.), Не должно быть никаких проблем в зависимом файле C, правильно? Препроцессор должен просто вставить собранный код соответственно, когда я вызываю свой файл makefile, по моему пониманию. Я ошибаюсь?C включает в себя включенные в заголовки

Повторим:

  • Скажем, у меня есть main.c с prototype.h.

  • prototype.h имеет в себе все мои обычные включает в себя библиотеки и что-нет.

  • У меня есть несколько других файлов C (secondary.c и tertiary.c, например), оба из которых нужны обычные библиотеки, а также, и может или не может потребоваться некоторые из прототипов, а также имеют свои собственные файлы заголовков.

Все, что я должен был бы сделать, это включить prototype.h в каждом из файлов C, правильно?

Кроме того, в этом случае, если бы я делал .o файл, используя -c флаг gcc в моем makefile, мне нужно обновить зависимость в мишени makefile?

Я думал, что у меня была твердая ручка, когда я начал, но теперь я полностью смущен.

+0

Неверно. Каждый исходный файл должен содержать заголовки, необходимые для компиляции инструкций **, содержащихся в этом исходном файле **. (исходный файл может, конечно, иметь заголовок, который включает необходимые файлы заголовков, но вы не можете полагаться на то, что в каком-то другом файле, где-то в вашем коде, также содержится этот файл - компиляторы не работают таким образом). Каждый исходный файл считается ** компилятором **, и он должен иметь необходимые заголовки, доступные ему напрямую. –

+0

Да, включая заголовок из другого заголовка, все еще работает, если он включен прямо или косвенно исходными файлами, которые ему нужны ... но неплохо включить заголовки прямо в файлы, которые их требуют, хотя, если только по какой-то причине, кроме ясности. – Dmitri

+0

См. [Должен ли я использовать '# include' в заголовках?] (Http://stackoverflow.com/questions/1804486/), на который отвечает« да ». Вы должны различать библиотеки (обычно объектный код, хранящиеся в специальных файлах) и заголовки (определенно не объектный код). Заголовки объявляют объекты, предоставляемые библиотекой, но это не то же самое, что и включение библиотеки. Если 'tertiary.c' нуждается в' prototypes.h', включите его. Если он также нуждается в 'tertiary.h', и это не включено в' prototypes.h', тогда включите 'tertiary.h' перед' prototypes.h' в 'tertiary.c'. Заголовки должны быть как автономными, так и идемпотентными. –

ответ

0

Это вопросы с несколькими ответами.

В простом случае вы включаете только заголовки, если они используются в файле .c. Заголовки - это зависимости для компиляции, поэтому заставляйте вас просто помещать их в одно и то же ведро, где используются файлы .c.

Для больших проектов для ускорения компиляции вы можете использовать так называемый «предварительно скомпилированный заголовок». Вы должны включить один и тот же заголовочный файл в каждый исходный файл, компилятор будет обрабатывать этот заголовок только один раз. Это очень полезно, когда заголовки сложны (например, boost library)

Смежные вопросы