|Lo que no hay que hacer en C/C++. Nivel basico|

<< < (14/14)

engel lex:
Cita de: Seyro97 en 30 Mayo 2015, 16:47 pm

Otra es no usar namespaces (sobre todo cuando solo vas a usar cout xD). Pongo un ejemplo:

Código 'malo':

Código
#include <iostream>
 
using namespace std;
 
int main() {
cout << "HOLA" << endl;
 
cin.get();
return 0;
}

Código 'bueno':

Código
#include <iostream>
 
int main() {
std::cout << "HOLA" << std::endl;
 
std::cin.get();
return 0;
}


explicate las razones

Stakewinner00:
Eso de los namespace si que esta prácticamente prohibido al programar librerías , porque el código de la librería podría entrar en conflicto con la del usuario. Pero no entiendo porque un programa sencillo no se puede usar eso...

Peregring-lk:
Cita de: Stakewinner00 en 30 Mayo 2015, 19:32 pm

Eso de los namespace si que esta prácticamente prohibido al programar librerías , porque el código de la librería podría entrar en conflicto con la del usuario. Pero no entiendo porque un programa sencillo no se puede usar eso...


De hecho, como bien dices, yo lo uso en código de usuario, y si hubiese un conflicto con una librería que no utilice yo directamente (librería utiliza indirectamente por las librerías que yo he añadido conscientemente), siempre puedo "evitar el conflicto con `::mivariable`, para indicar que la variable `mivariable` está en el espacio de nombres global.

En código de librería también estoy de acuerdo contigo en que no se debería usar, pero con un matiz: sólo en ficheros de cabecera. En ficheros de implementación (los `.cpp` de la librería), sí que creo que se podría utilizar sin problemas.

Aunque yo no domino mucho los matices de los espacios de nombres, he visto que muchas librerías importantes (sí, a veces me enfado tanto con los errores de ejecución que a veces me embarco en la horrorosa aventura de mirar el código fuente de una librería), utilizan nombres de espacio anónimos en los `.cpp`, porque los espacios de nombres anónimos hacen que todos los símbolos en él tenga enlazado estático, lo que significa que desde otras unidades de compilación no se puedan acceder a ellos:

Código
// libreria.hpp
namespace libreria {
 
   class loquesea {
   public:
        void fun1();
        void fun2();
   };
}
 
// libreria.cpp
#include "libreria.hpp"
 
namespace {
  using namespace std; // Al fin y al cabo, ahora el usuario es el implementador de la librería.
 
  // Clases y funciones auxiliares que realmente hacen el trabajo.
}
 
namespace libreria {
 
   void loquesea::fun1() { /* Implementacion utilizando las clases/funciones auxiliares */ }
   void loquesea::fun1() { /* Implementacion utilizando las clases/funciones auxiliares */ }
 
}

De ésta forma, todo aquello que vaya más allá de la interfaz pública con el usuario, es innacesible desde fuera, debido a que los símbolos del espacio de nombres anónimo tienen enlazado estático, y por tanto, pertenecen solamente a "ésta unidad" de compilación, como cuando declaras una función externa "static". Incluso los símbolos de la `std`, como se han "introducido" dentro de un espacio de nombres anónimo, desde fuera tampoco están visibles, y el usuario final (a no ser que escriba `using namespace std` en su código), no tendrá conflictos ni con la librería, ni con la `std`.

Es una forma se reduce muchísimo la cantidad de símbolos que el enlazador tiene que buscar.

Seyro97:
Cita de: Stakewinner00 en 30 Mayo 2015, 19:32 pm

Eso de los namespace si que esta prácticamente prohibido al programar librerías , porque el código de la librería podría entrar en conflicto con la del usuario. Pero no entiendo porque un programa sencillo no se puede usar eso...



Era un ejemplo :P

Seyro97:
Cita de: engel lex en 30 Mayo 2015, 17:16 pm

explicate las razones


Casi nunca miro este tema xDD. Siento no haber respondido antes. Las razones son una tontería, pero ya que C++ nos provee una estructura lógica, pues vamos a usarla... Vamos, eso pienso yo. Otra razón, aunque casi ni es razón, imaginemos que una librería que no conoce cout (? jaja), y usa cout para crear una clase, pues entonces habría un conflicto xD

Navegación

[0] Índice de Mensajes

[*] Página Anterior