visual solucion que proyecto nombre namespace form como cambiar c++ namespaces

c++ - solucion - como cambiar el nombre de un form en c#



espacio de nombre sin nombre (4)

¿Qué significa exactamente cuando el estándar establece

$ 7.3.1.1 / 2 - "El uso de la palabra clave estática está en desuso al declarar variables en un ámbito de espacio de nombres (ver anexo D); el espacio de nombres sin nombre proporciona una alternativa superior".

He referido esto pero no cubre lo que estoy buscando.

¿Hay algún ejemplo donde la superioridad esté claramente demostrada?

NB: Sé cómo los espacios de nombres sin nombre pueden hacer que las variables externas sean visibles en la unidad de traducción y aún así esconderlas de otras unidades de traducción. Pero el objetivo de esta publicación es sobre los nombres del ''alcance del espacio de nombre estático'' (por ejemplo, variables estáticas globales)


¿Qué significa exactamente?

Técnicamente obsoleto significa que un estándar futuro puede eliminar la función.

En la práctica eso no va a suceder, debido a la necesidad de admitir el código anterior.

Por lo tanto, en la práctica significa "muy desalentado".

Ejemplo de superioridad del espacio de nombre sin nombre

Un espacio de nombres sin nombre generalmente es superior porque lo que tienes en ese espacio de nombres puede tener un enlace externo.

En C ++ 98, la vinculación externa es necesaria para cosas que pueden ser parámetros de plantilla, por ejemplo, si desea instalar una plantilla en un char const* , debe ser un puntero a char que tenga un enlace externo.

#include <iostream> // Compile with "-D LINKAGE=static" to see problem with "static" #ifndef LINKAGE # define LINKAGE extern #endif template< char const* s > void foo() { std::cout << s << std::endl; } namespace { LINKAGE char const message[] = "Hello, world!"; } // namespace anon int main() { foo<message>(); }

Dicho esto, es un poco inconsistente que la static tampoco esté en desuso para las funciones.


El objetivo es definir un símbolo que existe solo dentro de su propia unidad de traducción. Esto puede ser "unidad de traducción global" y puede ser una variable o una función.

Esto se usa comúnmente en un archivo de definición de clase como una alternativa a los miembros privados de la clase estática ya que los miembros estáticos deben declararse en el encabezado, pero una función libre no tiene que ser (a menos que tenga que ser un amigo, que virtual, en realidad, nunca debe ser, por cierto).

El uso de estática sería:

static size_t BUFSIZE = 2048; // assume not const for this example static int myCallback( void * ptr );

El uso de un espacio de nombre anónimo es

namespace { size_t BUFSIZE = 2048; int myCallback( void * ptr ); }

El estándar dice que se prefiere la segunda construcción. Hemos encontrado que a veces es ventajoso usar estática además del espacio de nombre anónimo para reducir realmente el tamaño del binario.


Esta:

static int func_for_this_file_only() { ... }

es "tan bueno como" esto:

namespace { int func_for_this_file_only() { ... } }

pero no se puede usar static para esto:

namespace { class class_for_this_file_only { ... } }

Por lo tanto, los espacios de nombres anónimos en C ++ son más versátiles y superiores a los static .

(Estoy seguro de que alguien discutirá esa conclusión, pero como hacker de C creo que la solución de espacio de nombres anónimo es mejor).


Curiosamente, ISO / IEC 14882: 2011 (C ++ 11) eliminó este lenguaje (de hecho, elimina todo el párrafo §7.3.1.1 / 2). También elimina la mención de static del Anexo D.

Por lo tanto, el uso del especificador de clase de almacenamiento static para dar un nombre de vinculación interna todavía funciona (§3.5 / 3) y ya no está en desuso.