Объявление функции и согласованность определений

У меня есть источник, который говорит мне:

Исходный файл, который определяет функцию, должен включать заголовок, который содержит
объявление функции. Таким образом, компилятор проверит, что определение и
декларации последовательны.

Я не уверен, насколько это правильно, о какой «последовательности» мы говорим? Потому что если бы определение и объявление не были согласованы в типе возвращаемого значения или типе / числе аргумента, компилятор просто подумал бы, что я объявляю отдельную функцию, и вообще ничего не проверял бы.

Например. Если бы у меня был заголовочный файл 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) — это разные функции, и не стал бы шуметь по поводу согласованности. К какому типу последовательности это относится?

2

Решение

Интересный вопрос Ваш «источник» [я предполагаю, что это человек или книга, или …] не прав. Несмотря на то, что общепринято, что объявления функций в заголовочном файле с тем же базовым именем, что и файл, содержат тело функции, в этом нет необходимости.

Кроме, конечно, хороших стандартов кодирования.

Вы правы, две функции с одним и тем же именем, но с разными аргументами вполне приемлемы — как объявление функции, но не ее определение (если вы никогда не вызываете ее).

Компилятор C ++ не мешает вам стрелять себе в ногу, но хорошие практики кодирования делают.

Теперь, когда вы отредактировали цитату из книги в вопрос, я могу указать, что цитата говорит «должен», а не «должен». Использование здравого смысла не является обязательным или обязательным для языка. Это просто хорошая практика программирования.

Также обратите внимание, что программы типа lint вполне могут обнаружить и на это нарекать, даже если компилятор этого не делает.

3

Другие решения

Если у вас есть другой модуль компиляции, который зависит от вашего funcскажем, bar.cpp определено так:

#include "test.h"
void bar()
{
func();
}

Этот модуль компиляции импортирует ваш заголовок, и компилятор будет предполагать, что будет другой объектный файл, который определяет все, что объявлено в этом test.h заголовок.

Теперь, если бы у вас был только testsource.cpp определите другую функцию, вместо этого (с другой сигнатурой функции), компилятор на этом этапе будет жаловаться на ошибку компоновки: символ func() упоминается в bar.cpp не может быть найден нигде в его ссылки входов!

1