#c #linker
#c #компоновщик
Вопрос:
Пока я читаю «TCPL», появляется головоломка, я пытаюсь объяснить это, но безуспешно. Смотрите изображение ниже:страница 74 в «TCPL»
1. "getop.c"
и "stack.c"
оба включают, "calc.h"
хотя "getch.c"
этого не делают. Однако в "calc.h"
нем также объявляется функция int getch(void)
и void ungetch(int)
, определенная в "getch.c"
.
2. Программа выполняется правильно.
Мой вопрос таков: как файл заголовка "calc.h"
устанавливает соединение с исходным файлом, "getch.c"
пока нет include"..."
?
Ответ №1:
Определение функции также является объявлением. Таким образом, в «getch.c» нет необходимости явно объявлять getch
и ungetch
. По-прежнему неплохо включить «calc.h», чтобы убедиться, что определение в «getch.c» соответствует объявлениям, используемым в других c-файлах
Комментарии:
1. Это означает, что я также могу удалить
include"calc.h"
в «getop.c» и «stack.c» без эффекта?2. Если вы не вызываете функцию в модуле перевода, вам не нужно ее объявлять. Итак, если вы не вызываете какие-либо функции, объявленные в «calc.h», из «getop.c» или «stack.c», вам не нужно включать «calc.h». Но это ОЧЕНЬ хорошая идея сохранить include, чтобы компилятор мог пожаловаться, если определения не соответствуют объявлениям.