Прототип функции и включает заголовок в cpp

У меня есть функция, которая делает некоторую работу.

хиджры

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) в этом случае?

4

Решение

Всегда используйте прототип в заголовке, когда это возможно. Это предотвращает случайное внесение изменений в одно место, а не в другое.

Например, где изменить функцию на:

void doSomething(long n);

Теперь есть два других места: определение функции и прототип b.cpp для изменения.

Если у вас есть заголовок, у компилятора будет, по крайней мере, шанс сказать вам, что «это выглядит неправильно». Вместо того, чтобы поздно получить ошибку компоновщика …

6

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

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

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

редактировать

Предварительное объявление классов отличается от того, о чем вы спрашивали:

Следует ли использовать предварительные декларации вместо включений везде, где это возможно?

Ваше обновление

Не пишите свои заголовочные файлы, как это простой ответ. Заголовочные файлы должны, насколько это возможно, быть автономными и не содержать ничего, связанного с «открытым» интерфейсом. (Я помещаю ‘public’ в кавычки, потому что когда вы объявляете класс C ++, защищенные и приватные методы должны идти в одном и том же заголовочном файле ‘public’. Но вы все равно должны избегать помещения в заголовочный файл вещей, которые на самом деле не нужны будь там.)

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

5

По вопросам рекламы [email protected]