2010-08-26 3 views
5

Я немного туманно о правилах деклараций и определений.Различные декларации и определения в C++

У меня есть следующее объявление в funcs.h:

void sumTotalEnrgyAndClush(Protein &A,Protein &B,double ans[2],double enrgyA[18][18],double  enrgyB[18][18]); 

Обратите внимание, что ANS [2] находится перед enrgyA и Б.

В funcs.cpp файл определение начинается так:

void sumTotalEnrgyAndClush(Protein &A,Protein &B,double enrgyA[18][18],double enrgyB[18][18],double ans[2]) 

Он скомпилирует (через makefile) и отлично работает.

Я также заметил, что если я удалю объявление, компилятор, похоже, справится просто отлично.

Почему не происходит изменение порядка аргументов? Это то, что последние 3 элемента - все указатели, поэтому разница в порядке не имеет значения?

+0

Возможный дубликат [В чем разница между определением и декларацией?] (Http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a- декларация) – sbi

+2

Не дубликат; на самом деле интересный вопрос. –

+0

изменение на порядок *. * Пункт. EDIT: Джеймс Макнеллис сказал, что это лучше в его ответе. –

ответ

12

Почему не происходит изменение порядка аргументов?

вопрос. В C++ функции могут быть перегружены, поэтому две или более функции могут иметь одно и то же имя, если они имеют разные параметры (или, если они являются функциями-членами, если они отличаются в const-qualification).

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

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

+0

Хотелось бы, чтобы я мог возвысить это несколько раз! – Kangkan

+0

Что изначально смутило меня в том, что моя программа работала, несмотря на то, что вы упомянули в своем последнем предложении. С тех пор я заметил, что в файле main.cpp есть дополнительное определение, которое соответствует объявлению в файле funcs.h. Но ваш ответ был отличным дополнением к моим общим знаниям. Спасибо. – Meir

+1

@Dave: Если вы придерживаетесь набора правил, в которых определения используются для вещей, объявленных в заголовках (например, все в 'xh' определено в' x.cpp'), вы не будете иметь несколько (разных) определений за то же самое. Когда вы будете в реальном большом проекте (тысячи исходных файлов), вам это понадобится, или вы никогда не сможете найти свой путь. – sbi

Смежные вопросы