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

Páginas: << < (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

Páginas: << < (14/14)