Головоломка по ссылке на несколько исходных файлов в «TCPL»

#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, чтобы компилятор мог пожаловаться, если определения не соответствуют объявлениям.