¿cómo debo declarar las funciones de espacio de nombres en el archivo de encabezado?
namespace MON {
// extern:
t_ret func(const t_param& pValue);
// 'inline':
inline t_ret inline_func(const t_param& pValue) { ... }
} // << MON
En caso de cabecera sólo contienen definiciones de funciones como el archivo de cabecera de la clase y las implementaciones deben estar en cpp, o debería aplicar de inmediato las funciones en el archivo de cabecera?
que depende de si desea que (inline) forme o se exporte. esto a menudo se reduce a minimizar las dependencias.
para expandir el exportador o procesos en línea:
que habría menudo favorecen una función extern para minimizar las dependencias en C++. esto es equivalente a separar la definición de la declaración en un método de clase:
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) { ... }
Sin embargo, es en los momentos críticos para la definición para ser visible en algunos casos, a menudo para el rendimiento o cuando se conoce el tamaño es importante y el encabezado no se incluye en muchos lugares. por lo tanto, la variante inline
también es una opción.
una función en línea aún se puede exportar, y puede estar en línea según lo solicitado; sin embargo, cualquier copia de función en línea puede fusionarse (específicamente, la implementación puede suponer que todas las definiciones son iguales y cualquier copia de la función innecesario).
con definiciones exportadas, puede restringir (o poner en cuarentena) selectivamente sus dependencias de inclusión. es decir, #include "hefty_stuff.hpp"
no necesita estar en el encabezado para usar las funciones en file.hpp
.
Básicamente, estoy tratando de implementar una aplicación para analizar un archivo de texto que contiene algunos comandos. Así que estoy pensando en implementar métodos estáticos de ayuda para manejar el procesamiento de texto.
bien, static
debe evitarse aquí. C++ usa la regla de una sola definición. static
resultará en muchas copias innecesarias. Por otra parte, un espacio de nombres en el anonimato es el enfoque C++ para la función de c static
:
namespace {
t_ret func(const t_param& pValue) { ... }
} // << anon
nota: espacios de nombres anónimos también pueden dar lugar a copias innecesarias. la razón por la que los usaría como sustituto de una función estática es si quiere o necesita desviarse de la regla de una definición, y no quiere declarar el símbolo en un ámbito que pueda 'resolverse'.
el punto final se refiere a template<>
declaraciones. con plantillas, la definición debe ser visible donde se use, a menos que su compilador admita plantillas externas. para las plantillas, puede lograr la visibilidad de la definición de múltiples maneras. Por lo general, las personas simplemente declaran la definición en su lugar o agregan un encabezado para las definiciones que se incluyen al final del encabezado o según sea necesario. con plantillas, las funciones no necesitan declararse inline
para evitar múltiples errores de definición.
C++ establece una distinción muy clara entre las funciones y clases . No está claro a partir de su pregunta cuál le interesa usar. – Shep
Hola Shep, gracias por el comentario. Agregué más detalles a mi pregunta. ¿Responde a tu pregunta? –