Подтвердить что ты не робот

Функции пространства имен С++

Я разработчик Java, и я довольно новичок в С++. Мне нужно реализовать какой-то класс утилиты, и я думал о внедрении методов как статических. Однако я столкнулся с qaru.site/info/31991/... относительно функций пространства имен и статического метода, и, вероятно, предпочтительными являются функции пространства имен. Поэтому я хотел бы написать, если есть какая-либо статья или пример о том, как реализовать функцию пространства имен. Например, как мне объявить функции пространства имен в файле заголовка? Должен ли заголовок содержать описания функций, такие как заголовочный файл класса, а реализации должны быть в файле cpp или мне нужно сразу же реализовать функции в заголовочном файле?

В принципе, я пытаюсь реализовать приложение для синтаксического анализа текстового файла, содержащего некоторые команды. Поэтому я думаю о реализации статических вспомогательных методов для обработки текста. Например, readCommand (строка строки). Пожалуйста, дайте мне знать, если я не в том направлении. Благодаря

4b9b3361

Ответ 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, чтобы избежать множественных ошибок определения.

Ответ 2

Вы можете объявить функции в заголовке:

namespace A {
    void foo();
}

и реализовать в .cpp:

namespace A {
  void foo() { std::cout << "foo!"; }
}

Вы также можете поместить реализацию в заголовок, убедившись, что объявите ее inline, чтобы не нарушить одно правило определения:

namespace A {
    inline void foo() { std::cout << "foo()!"; }
}

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

Очень важно поместить реализацию функций шаблона в заголовок или в файл, включенный в заголовок, они не могут попасть в .cpp:

namespace B {
  template <class T>
  inline void foo(const T& t) { std::cout << t.name() << "\n"; }
}

Ответ 3

Как мне объявить функции пространства имен в файле заголовка?

namespace YourNamespace
{
    void fun1();
    void fun2();
}

Если заголовок содержит только определения функций, такие как заголовочный файл класса, а реализации должны быть в файле cpp или мне нужно сразу же реализовать функции в файле заголовка?

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