У меня есть источник, который говорит мне:
Исходный файл, который определяет функцию, должен включать заголовок, который содержит
объявление функции. Таким образом, компилятор проверит, что определение и
декларации последовательны.
Я не уверен, насколько это правильно, о какой «последовательности» мы говорим? Потому что если бы определение и объявление не были согласованы в типе возвращаемого значения или типе / числе аргумента, компилятор просто подумал бы, что я объявляю отдельную функцию, и вообще ничего не проверял бы.
Например. Если бы у меня был заголовочный файл test.h:
void func();
И исходный файл testsource.cpp:
#include <iostream>
#include "test.h"using namespace std;
void func(int x){
cout << "Hello StackOverflow" << endl;
}
Если бы я запустил эту программу, компилятор просто подумал бы, что func () и func (int) — это разные функции, и не стал бы шуметь по поводу согласованности. К какому типу последовательности это относится?
Интересный вопрос Ваш «источник» [я предполагаю, что это человек или книга, или …] не прав. Несмотря на то, что общепринято, что объявления функций в заголовочном файле с тем же базовым именем, что и файл, содержат тело функции, в этом нет необходимости.
Кроме, конечно, хороших стандартов кодирования.
Вы правы, две функции с одним и тем же именем, но с разными аргументами вполне приемлемы — как объявление функции, но не ее определение (если вы никогда не вызываете ее).
Компилятор C ++ не мешает вам стрелять себе в ногу, но хорошие практики кодирования делают.
Теперь, когда вы отредактировали цитату из книги в вопрос, я могу указать, что цитата говорит «должен», а не «должен». Использование здравого смысла не является обязательным или обязательным для языка. Это просто хорошая практика программирования.
Также обратите внимание, что программы типа lint вполне могут обнаружить и на это нарекать, даже если компилятор этого не делает.
Если у вас есть другой модуль компиляции, который зависит от вашего func
скажем, bar.cpp
определено так:
#include "test.h"
void bar()
{
func();
}
Этот модуль компиляции импортирует ваш заголовок, и компилятор будет предполагать, что будет другой объектный файл, который определяет все, что объявлено в этом test.h
заголовок.
Теперь, если бы у вас был только testsource.cpp
определите другую функцию, вместо этого (с другой сигнатурой функции), компилятор на этом этапе будет жаловаться на ошибку компоновки: символ func()
упоминается в bar.cpp
не может быть найден нигде в его ссылки входов!