elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  |Lo que no hay que hacer en C/C++. Nivel basico|
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: 1 2 3 4 5 6 [7] Ir Abajo Respuesta Imprimir
Autor Tema: |Lo que no hay que hacer en C/C++. Nivel basico|  (Leído 159,683 veces)
skan


Desconectado Desconectado

Mensajes: 1.360


Ver Perfil
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #60 en: 13 Agosto 2013, 16:34 pm »

Hola

Había leído esto hace un tiempo en el libro "effective c++" y algún otro sitio.
Hoy he querido consultar otra vez este tipo de comandos (como fgets o strncpy) pero no aparecen en libros modernos como Prata 6th edition o Professional C++.
¿Quiere eso decir que ya no son necesarios?
Lo digo porque get, strcpy...   aceptan también un  parámetro especificando el número de caracteres. ¿Qué ventaja hay ahora por ejemplo entre fgets y get?

saludos


En línea

fakundo (sylas)

Desconectado Desconectado

Mensajes: 10


en EL Hacker.net


Ver Perfil
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #61 en: 6 Enero 2014, 18:02 pm »

Buen post aun que yo no me entero mucho pero comprendo algo pero es normal jeje aun hago la eso


En línea

el conocimiento es libre

somos anonymous

somos legion

nosotros no olvidamos

nosotros no perdonamos
DéstroReflex

Desconectado Desconectado

Mensajes: 1



Ver Perfil
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #62 en: 17 Febrero 2014, 06:06 am »

Gracias por la explicación, son el tipo de cosas que te enseñan "por defecto" pero no tienes ni idea de que función realmente cumplen y qué podrían afectar.
En línea

Siempre tonto, cada vez mejor maestro.
Peregring-lk

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #63 en: 23 Mayo 2015, 00:14 am »

Nota: Respecto a los ejemplos que voy a poner aquí: ¡¡no lo hagáis en casa!! Son prácticas permitidas pero ¡antigüas, deprecated e incluso mal vistas!

Respecto al `void main()` que se cita en la guía, si programas en C++, un compilador de C++ decente te dirá que es un error de compilación y no te dejará continuar. No es que sea una mala costumbre, es que es un programa con un error sintáctico.

Sin embargo, si `main` tiene tipo `int main()`, pero no escribes un `return`, no te dará ningún error de compilación porque el estándar dice que el compilador debe añadir al final del `main` un `return 0` si no lo tiene ya. Y los compiladores obedecen al estándar como buenos esclavos.

En C, sin embargo, la cosa es aún más permisiva. Puedes no escribir el `return`, y el compilador lo añadirá. Puedes hacer que su tipo de retorno sea `void`, y el compilador también añadirá el `return 0`: ¿pero eso no puede ser? ¿un `void` no puede devolver un `int`? Ya, pero es que ese `return` se añade a nivel de ensamblador, y en ensamblador no existen tipos.

Incluso en C puedes no escribir tipo de retorno:

Código
  1. main() {}

El compilador solo te lanzará un warning diciendo que el tipo de retorno por defecto es `int` (y también te añadirá el `return 0`). De hecho, en C puedes declarar cualquier cosa sin tipo (tipos de retorno, parámetros o variables; todas serán por defecto `int`, eso sí, con warnings por doquier):

Código
  1. void f(a) {}

Y `a` tendrá por defecto tipo `int` (con su correspondiente warning). Y llevando al extremo las cosas raras, ésto también es C estándar (se permite por retrocompatibilidad con versiones antigüas de C):

Código
  1. void f(a) int a;
  2. {}

Aquí, el tipo de `a` se declara a posteriori, entre el nombre de la funcion y su cuerpo. No hace falta decir que todo ésto no se puede hacer en C++ (un compilador de C++ gritará como una loca).

Y repito, no hagáis nada de ésto en casa si no queréis que mate a un gatito.



En línea

Seyro97

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #64 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
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main() {
  6. cout << "HOLA" << endl;
  7.  
  8. cin.get();
  9. return 0;
  10. }

Código 'bueno':

Código
  1. #include <iostream>
  2.  
  3. int main() {
  4. std::cout << "HOLA" << std::endl;
  5.  
  6. std::cin.get();
  7. return 0;
  8. }
En línea

Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #65 en: 30 Mayo 2015, 17:16 pm »

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

Código 'malo':

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main() {
  6. cout << "HOLA" << endl;
  7.  
  8. cin.get();
  9. return 0;
  10. }

Código 'bueno':

Código
  1. #include <iostream>
  2.  
  3. int main() {
  4. std::cout << "HOLA" << std::endl;
  5.  
  6. std::cin.get();
  7. return 0;
  8. }

explicate las razones
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #66 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...
En línea

Peregring-lk

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #67 en: 30 Mayo 2015, 21:56 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
  1. // libreria.hpp
  2. namespace libreria {
  3.  
  4.    class loquesea {
  5.    public:
  6.         void fun1();
  7.         void fun2();
  8.    };
  9. }
  10.  
  11. // libreria.cpp
  12. #include "libreria.hpp"
  13.  
  14. namespace {
  15.   using namespace std; // Al fin y al cabo, ahora el usuario es el implementador de la librería.
  16.  
  17.   // Clases y funciones auxiliares que realmente hacen el trabajo.
  18. }
  19.  
  20. namespace libreria {
  21.  
  22.    void loquesea::fun1() { /* Implementacion utilizando las clases/funciones auxiliares */ }
  23.    void loquesea::fun1() { /* Implementacion utilizando las clases/funciones auxiliares */ }
  24.  
  25. }

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.
En línea

Seyro97

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #68 en: 12 Junio 2015, 03:20 am »

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
En línea

Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!
Seyro97

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: |Lo que no hay que hacer en C/C++. Nivel basico|
« Respuesta #69 en: 24 Octubre 2015, 08:48 am »

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
« Última modificación: 24 Octubre 2015, 08:50 am por Seyro97 » En línea

Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!
Páginas: 1 2 3 4 5 6 [7] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayudaa problema nivel basico
Programación C/C++
krowa 0 1,918 Último mensaje 13 Marzo 2012, 23:48 pm
por krowa
Problema con la creación de tablas SQL nivel básico.
Desarrollo Web
nikko88 2 2,322 Último mensaje 25 Junio 2012, 17:48 pm
por nikko88
[Nivel 1/10] CrackMe básico C #4 « 1 2 »
Ingeniería Inversa
cibergolen 12 9,136 Último mensaje 30 Diciembre 2012, 22:42 pm
por cibergolen
[C] problemas de ejecucion con un for (nivel basico, 1ro de carrera) [?] « 1 2 3 »
Programación C/C++
SoyelRobert 20 11,937 Último mensaje 16 Diciembre 2013, 21:24 pm
por SoyelRobert
[Tutorial Nivel básico] Haciendo cantar a nuestro Crackme
Ingeniería Inversa
fary 5 3,989 Último mensaje 6 Febrero 2016, 00:03 am
por fary
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines