Заголовочные файлы и прямое объявление - PullRequest
2 голосов
/ 21 января 2011

http://www.learncpp.com/cpp-tutorial/19-header-files/

В качестве еще одного решения "форвард декларации" упоминается следующее:

Файл заголовка должен быть записан только один раз, и его можно включить встолько файлов, сколько нужно.Это также помогает в обслуживании, сводя к минимуму количество изменений, которые необходимо внести, если прототип функции когда-либо изменится (например, путем добавления нового параметра).

Но это также нельзя сделать с помощью "предварительная декларация "?Поскольку мы определяем функцию int add(int x, int y), например, в «add.cpp», и используем эту функцию в «main.cpp», набрав:

int add (int x, int y);

?Спасибо.

Ответы [ 5 ]

4 голосов
/ 21 января 2011

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

  1. Вы только что скопировали одну и ту же декларацию во многие разные файлы.Если вы когда-нибудь измените сигнатуру функции, вам придется менять каждое место, куда вы вставили ее прямое объявление.
  2. Само предварительное объявление не говорит вам, в каком файле определена действительная функция. Если вы используетеРазумный метод организации ваших заголовочных файлов и исходных файлов (например, каждая функция, определенная в файле .cpp, объявляется в файле .h с тем же именем), то место, в котором определяется функция, подразумевается местом, в которомон объявлен.
  3. Ваш код будет менее читаемым для других программистов, которые очень привыкли использовать заголовочные файлы для всего (по уважительной причине), даже если все, что вам нужно из заголовка, это одна конкретная функция, и вымог бы легко переслать - объявить это сам.
2 голосов
/ 21 января 2011

Вы можете использовать предварительное объявление, но оно плохо масштабируется и неудобно, если вы используете чей-то код или библиотеку.

Как правило, заголовочный файл определяет интерфейс с кодом.

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

Решение для файла заголовка гораздо более легко обслуживаемо (меньше подвержено ошибкам) ​​и позволяет гораздо проще точно определить, какой код используется.

2 голосов
/ 21 января 2011

Заголовочные файлы содержат предварительные объявления - вот что они делают. Проблема, которую они решают, - это когда у вас есть более сложный проект с несколькими файлами исходного кода.

Вы можете иметь библиотеку функций, например, matrix.c для матричных операций. Без заголовочных файлов вам бы пришлось скопировать предварительные объявления для всех функций matrix.c во все остальные исходные файлы. Вы также должны будете поддерживать все эти копии в актуальном состоянии с любыми изменениями в matrix.c.

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

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

1 голос
/ 21 января 2011

IC и C ++ по сути помещают все прямые и / или внешние объявления в заголовок.Это обеспечивает удобный способ включения их в различные исходные файлы без необходимости включать их вручную.

В вашем случае, если у вас есть add, определенный в add.cpp, вы можете просто предоставить внешнее объявление в main.cpp и все круто.Заголовочный файл предназначен для того, чтобы помочь вам, когда у вас есть большое количество файлов, для которых нужно добавить объявление, и вы не хотите делать это для каждого.

0 голосов
/ 21 января 2011
int add(int x, int y); // forward declaration using function prototype

Можете ли вы объяснить "предварительную декларацию" дальше? В чем проблема, если мы используем его в функции main ()?

Это так же, как #include"add.h". Если вы знаете, препроцессор разворачивает файл, который вы упомянули в #include, в файл .cpp, где вы пишете директиву #include. Это означает, что если вы пишете #include"add.h", вы получаете то же самое, как если бы вы делали «предварительное объявление».

Я предполагаю, что add.h имеет эту строку:

int add(int x, int y); 

Что такое предварительные объявления в C ++?

...