Ответ 1
как мне объявить функции пространства имен в файле заголовка?
namespace MON {
// extern:
t_ret func(const t_param& pValue);
// 'inline':
inline t_ret inline_func(const t_param& pValue) { ... }
} // << MON
Если заголовок содержит только определения функций, такие как заголовочный файл класса, а реализации должны быть в файле cpp или мне нужно сразу же реализовать функции в файле заголовка?
который зависит от того, хотите ли вы их (потенциально) встраивать или экспортировать. это часто сводится к минимизации зависимостей.
для экспорта или вставки:
вы часто предпочитаете функцию extern для минимизации зависимостей в С++. это эквивалентно разделению определения из объявления в методе класса:
file.hpp
namespace MON {
// extern:
t_ret func(const t_param& pValue);
} // << MON
file.cpp
#include "hefty_stuff.hpp"
MON::t_ret MON::func(const t_param& pValue) { ... }
однако, порой критически важно, чтобы определение было видимым в некоторых случаях, часто для производительности или когда вы знаете, что размер важен, а заголовок не включен во многие места. таким образом, вариант inline
также является опцией.
встроенная функция все еще может быть экспортирована и может быть включена в соответствии с запросом - однако любые встроенные копии функций могут быть объединены (в частности, реализация может принимать все определения равными и любые копии функции не нужны).
с экспортированными определениями, вы можете выборочно ограничить (или карантин) ваши зависимые включения. то есть #include "hefty_stuff.hpp"
не обязательно должно быть в заголовке, чтобы использовать функции в file.hpp
.
В принципе, я пытаюсь реализовать приложение для синтаксического анализа текстового файла, содержащего некоторые команды. Поэтому я думаю о реализации статических вспомогательных методов для обработки текста.
Ну, static
следует избегать здесь. С++ использует правило с одним определением. static
просто приведет к большому количеству ненужных копий. кроме того, анонимное пространство имен является С++-подходом к функции c static
:
namespace {
t_ret func(const t_param& pValue) { ... }
} // << anon
Примечание: анонимные пространства имен также могут привести к ненужным копиям. причина, по которой вы будете использовать их в качестве замены статической функции, - это то, что вам нужно или нужно отклоняться от правила с одним определением, и не хотите объявлять символ в области, которая может быть "разрешена".
конечная точка рассматривает объявления template<>
. с шаблонами определение должно быть видимым там, где оно используется, если только ваш компилятор не поддерживает внешние шаблоны. для шаблонов вы можете выполнить определение видимости несколькими способами. обычно люди просто объявляют определение на месте или добавляют заголовок для определений, который включается либо в конец заголовка, либо по мере необходимости. с шаблонами функции не должны быть объявлены inline
, чтобы избежать множественных ошибок определения.