У меня есть функция, которая делает некоторую работу.
хиджры
void doSomething(int n);
a.cpp
#include "A.h"
void doSomething(int n) {
/* something */
}
Если я хочу использовать эту функцию в другом исходном файле, что является лучшим выбором:
1) включить А.ч
B.cpp
#include "A.h"
void anotherTask() {
// ...
doSomething(5);
// ...
}
2) или используйте предварительное объявление (прототип функции):
B.cpp
void doSomething(int);
void anotherTask() {
// ...
doSomething(5);
// ...
}
Есть много советов об использовании предварительных объявлений как можно чаще для классов. Итак, какова лучшая практика для объявления функции forward?
UPD
Хорошо, это слишком простой пример.
Что если в заголовке A.h есть какой-то мусор (относительно B.cpp, который ничего не знает об уровне драйверов):
хиджры
#include "specific_driver_header.h" /* some lowlevel stuff that B.cpp couldn't know */
#define SPECIFIC_DRIVER_DEFINES 0xF0 /* useless define for B.cpp that uses global namespace */
void doSomething(int n); /* only significant function for B.cpp */
Если я включу A.h в B.cpp, то B.cpp не будет независимым от драйверов или что-то в этом роде.
Должен ли я использовать вариант (2) в этом случае?
Всегда используйте прототип в заголовке, когда это возможно. Это предотвращает случайное внесение изменений в одно место, а не в другое.
Например, где изменить функцию на:
void doSomething(long n);
Теперь есть два других места: определение функции и прототип b.cpp для изменения.
Если у вас есть заголовок, у компилятора будет, по крайней мере, шанс сказать вам, что «это выглядит неправильно». Вместо того, чтобы поздно получить ошибку компоновщика …
Я использую предварительное объявление только тогда, когда функция используется только в этом файле.
Если вы хотите сделать его доступным для других устройств, вы используете файл заголовка, а затем вы не используйте предварительное объявление (если вы не решаете очень специфическую проблему, такую как циклические зависимости). Не используйте оба. Никогда не делайте одно и то же заявление более чем в одном месте.
редактировать
Предварительное объявление классов отличается от того, о чем вы спрашивали:
Следует ли использовать предварительные декларации вместо включений везде, где это возможно?
Ваше обновление
Не пишите свои заголовочные файлы, как это простой ответ. Заголовочные файлы должны, насколько это возможно, быть автономными и не содержать ничего, связанного с «открытым» интерфейсом. (Я помещаю ‘public’ в кавычки, потому что когда вы объявляете класс C ++, защищенные и приватные методы должны идти в одном и том же заголовочном файле ‘public’. Но вы все равно должны избегать помещения в заголовочный файл вещей, которые на самом деле не нужны будь там.)
Тем не менее, если у вас нет выбора по этому вопросу, все равно лучше включить соответствующий заголовочный файл, чем дублировать декларацию. Поддерживаемость обычно важнее скорости компиляции.