tuberias que procesos pipes pid_t nombre hilos entre ejemplo crear con comunicacion c++ static namespaces deprecated

que - ¿Cuándo es apropiado usar static(sobre espacios de nombres sin nombre) en C++?



pipes en c (4)

He estado leyendo artículos sobre espacios de nombres sin nombre todo el día, la mayoría de los artículos se explican cuando debe usar espacios de nombre sin nombre sobre la palabra clave estática. Pero aún me queda una gran pregunta cuando es apropiado usar estática. Después de todo, no está completamente en desuso, ¿qué pasa con los archivos de cabecera con funciones estáticas si los pongo ahora en espacios de nombres sin nombre?

#ifndef HEADER_H #define HEADER_H static int func() { ... } // versus: namespace { int func() { ... } }; #endif // HEADER_H

¿O qué hay de las funciones de miembros estáticos?

Saludos


En un archivo de encabezado, generalmente no tiene sentido especificar un enlace interno o usar un espacio de nombre anónimo.

En un archivo de implementación compilado por separado, puede usar un espacio de nombres static o anónimo para evitar colisiones de nombres de nivel de vinculación o un código de cliente que dependa de los detalles de implementación. Un espacio de nombre anónimo le permite tener un enlace externo, que es necesario para los parámetros de la plantilla, y también es compatible con las definiciones de clase. Pero al final es solo una cuestión de practicidad y preferencia personal, caso por caso.

static para una función de miembro no tiene nada que ver con la especificación de vinculación. Una función miembro static tiene enlaces externos de todos modos.


No hay ninguna ventaja de la estática en el ámbito del espacio de nombres sobre los espacios de nombre sin nombre que yo sepa. Use espacios de nombres sin nombre, como en el ejemplo anterior. De hecho, en el ejemplo anterior no puedo ver por qué es necesario el espacio de nombre estático o sin nombre. Tal vez en línea? Y las funciones de miembros estáticos no tienen nada que ver con la estática en el ámbito del espacio de nombres. Las funciones de miembro estático (y los miembros que no funcionan) siguen siendo válidas.


La redacción precisa del estándar es:

El uso de la palabra clave static está en desuso al declarar objetos en el ámbito del espacio de nombres.

Las funciones en un archivo de encabezado deben estar en inline lugar de static o en un espacio de nombre sin nombre. inline significa que solo obtendrá como máximo una copia de la función en su programa, mientras que los otros métodos le darán una copia separada de cada archivo que incluya el encabezado. Además de hinchar, esto podría dar un comportamiento incorrecto si la función contiene datos estáticos de función. ( EDITAR: a menos que se suponga que la función tenga definiciones diferentes en diferentes unidades de compilación, quizás debido a diferentes macros de preprocesador que se definen antes de incluir el archivo de encabezado. En ese caso, el mejor enfoque es no incluirlo en absoluto, sino enterrarlo en una tumba sin nombre con una estaca a través de su corazón impío).

Los objetos de datos, aparte de las constantes, por lo general no deberían definirse en los archivos de encabezado en absoluto, solo declarados extern .

Las funciones de miembros estáticos son una olla diferente de peces, y debe usar static allí ya que no hay otra manera de declararlos. Ese uso no está en desuso, ya que no está en el ámbito del espacio de nombres.

ACTUALIZACIÓN: C ++ 11 ha eliminado la desactivación, por lo que ya no hay ninguna razón particular para preferir los espacios de nombres no nombrados sobre static . Pero todavía no deberías usar ninguno en un archivo de encabezado a menos que estés haciendo algo extraño.


static puede ser preferible si está usando algunas herramientas. También se comporta un poco mejor con la funcionalidad de sangría automática en la mayoría de los editores de texto. Es un poco triste, cuando tienes que evitar usar algo útil porque no funciona con herramientas que realmente deberían soportarlo, pero te prometo que lo superarás.

Una pregunta de ejemplo que da alguna pista de posibles daños en el departamento de depuración:

¿Visualiza variables globales con espacios de nombres en el depurador de Visual Studio?

Probablemente no tengas que buscar mucho para encontrar más problemas, pero los problemas del depurador fueron suficientes para hacer que abandonara por completo los espacios de nombres, en la mayor medida posible, así que nunca he buscado más.

Mi recomendación personal es que para el código que estará por menos de una vez, uno podría ir con static . Hace efectivamente lo mismo que un espacio de nombre sin nombre, pero, promediado en todas las herramientas, es mejor admitido. En teoría, un día desaparecerá por completo, pero estoy feliz de admitir públicamente que estoy seguro de que ese día nunca se cumplirá. Y mientras tanto, te estás ahorrando algo de dolor.