Нужно ли декларировать функцию в файле .h, если она нужна только в файле .cpp? - PullRequest
2 голосов
/ 05 октября 2019

Требуется ли объявление функции в файле .h, если мне нужна только эта функция для работы с одним файлом .cpp? Кажется, что объявление функции в файле .cpp также работает.

Существуют ли различия в производительности, и можно ли это делать? Почему это необычная практика? (по крайней мере, я этого не видел)

Ответы [ 2 ]

2 голосов
/ 05 октября 2019

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

Если функцию следует использовать только в одной единице компиляции, ее можно определить в модуле cpp. Причем желательно сделать это с внутренней связью. В противном случае кто-то может определить аналогичную функцию с тем же типом в своем собственном модуле, и правило ODR будет нарушено.

Разницы в производительности нет, поскольку компилятор работает с модулями компиляции, которые включают всеперечисленные заголовки не являются модулями без заголовков.

1 голос
/ 05 октября 2019

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

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

Другими словами, выполните:

namespace {
    void foo() {
        // ...
    }
}

См. Также Безымянное / анонимное пространство имен против статических функций и Превосходство безымянного пространства имен над статическим?

...