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