He estado usando la palabra clave static
durante mucho tiempo para definir el enlace interno. Más tarde, cambié al estilo C++ de envolver cosas locales en espacios de nombres anónimos.Espacios de nombres anónimos: ¿Son realmente tan buenos?
Sin embargo, ahora que he trabajado con espacios de nombres anónimos durante algunos años, ¡empiezo a pensar que la palabra clave static
es mucho más fácil de trabajar!
Un problema común es que tengo este patrón:
namespace {
// ...five pages of code...
} // namespace
Para ver si una determinada función tiene enlace interno o externo, ahora tengo que desplazarse mucho, en comparación con el estilo C de edad donde podría simplemente verificar si la función/objeto tenía static
delante de él.
Sé que hay espacios de nombres anónimos que static
no pueden - ocultar typedefs - pero personalmente no estoy muy interesado en eso, de todos modos.
¿Cuál es su opinión sobre esto? ¿Es la ganancia de espacios de nombres anónimos tan grande que garantiza la disminución de la legibilidad? ¿O estoy completamente equivocado?
funciones 'estáticas' en el ámbito del espacio de nombres han quedado en desuso, eso es motivo suficiente para no usarlas. Las funciones en el espacio de nombres anónimo tienen todas las ventajas de 'static', excepto que tienen un enlace externo. El último, creo que ya está siendo atendido por los compiladores, eliminando nombres definidos en espacios de nombres anónimos de la sección exportada. –
@Gene en realidad, las funciones estáticas nunca se desaprobaron. La depreciación fue solo contra * objetos *. Sin embargo, la obsolescencia se eliminó en n3225: en C++ 0x ya no está en desuso para usarlo para proporcionar enlaces internos a objetos o funciones. Otra diferencia es que los espacios de nombre sin nombre retendrían el enlace externo: los espacios de nombre sin nombre y su contenido obtendrán un enlace interno en C++ 0x. De modo que ya no parece haber ninguna diferencia entre el modo estático y el espacio de espacio de nombres, excepto que el espacio de nombre de nombres permitirá cosas como 'namespace {int a; } int a; '. –
@Johannes: ¿C++ 0x permite parámetros de plantilla con enlace interno, o es un gran cambio de último momento? –