Herramientas de usuario

Herramientas del sitio


cpp-avanzado:opciones-gcc

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
cpp-avanzado:opciones-gcc [2017/11/26 02:24]
santo
cpp-avanzado:opciones-gcc [2023/11/29 15:14] (actual)
santo
Línea 10: Línea 10:
 Una vez abierto Geany, vamos al menú “Construir” / “Build”,​ y seleccionamos “Configurar Comandos de Construcción” / “Set Build Commands”. Allí reemplazamos el valor de la columna “Comando” / “Command” de la fila “Compilación” / “Compile” (Sección C++ commands) por la siguiente línea completa: Una vez abierto Geany, vamos al menú “Construir” / “Build”,​ y seleccionamos “Configurar Comandos de Construcción” / “Set Build Commands”. Allí reemplazamos el valor de la columna “Comando” / “Command” de la fila “Compilación” / “Compile” (Sección C++ commands) por la siguiente línea completa:
  
-g++ -std=c++11 -g -O2 -Wconversion -Wshadow -Wall -Wextra -D_GLIBCXX_DEBUG -c %f+<code cpp> 
 +g++ -std=gnu++11 -g -O2 -Wconversion -Wshadow -Wall -Wextra -D_GLIBCXX_DEBUG -c "%f
 +</​code>​
  
 Hacemos lo mismo con la línea que está inmediatamente debajo, “Construcción” / “Build”,​ reemplazándola por lo siguiente: Hacemos lo mismo con la línea que está inmediatamente debajo, “Construcción” / “Build”,​ reemplazándola por lo siguiente:
  
-g++ -std=c++11 -g -O2 -Wconversion -Wshadow -Wall -Wextra -D_GLIBCXX_DEBUG -o %e” “%f+<code cpp> 
 +g++ -std=gnu++11 -g -O2 -Wconversion -Wshadow -Wall -Wextra -D_GLIBCXX_DEBUG -o "%e" "%f
 +</​code>​
  
-Cerramos la ventana presionando “Aceptar” / “Ok”. Con esto ya tenemos el entorno completamente configurado,​ y estamos listos para crear programas en Geany.+Cerramos la ventana presionando “Aceptar” / “Ok”. ​ 
 + 
 +**¡LISTO!:​-D** 
 + 
 +Con esto ya tenemos el entorno completamente configurado,​ y estamos listos para crear programas en Geany.
  
 ===== Explicación detallada de las opciones agregadas ===== ===== Explicación detallada de las opciones agregadas =====
Línea 22: Línea 30:
 **La siguiente información no es necesaria en absoluto para programar**. Conocer exactamente qué efecto tiene cada una de las opciones anteriores no es importante en una primera etapa. **La siguiente información no es necesaria en absoluto para programar**. Conocer exactamente qué efecto tiene cada una de las opciones anteriores no es importante en una primera etapa.
  
-No obstante, para el beneficio de programadores avanzados de C++, se resume a continuación una explicación de cada opción propuesta.+No obstante, para el beneficio de programadores avanzados de C++ 8-), se resume a continuación una explicación de cada opción propuesta.
  
-  * ''​-std=c++11''​ : Esta opción permite utilizar [[cpp-avanzado:​c_11| C++11]], y hoy en día casi todas las competencias de programación ​lo utilizan.+  * ''​-std=gnu++11''​ : Esta opción permite utilizar [[cpp-avanzado:​c_11| C++11]], y hoy en día casi todas las competencias de programación utilizan ​C++11 o superior.
   * ''​-g''​ : Retiene información de símbolos de debugging en el ejecutable final. Esto significa que se puede ver qué funciones se están ejecutando al utilizar un debugger o ante un [[https://​en.wikipedia.org/​wiki/​Core_dump|"​core dump"​]]. Generalmente es irrelevante si no se utilizan debuggers.   * ''​-g''​ : Retiene información de símbolos de debugging en el ejecutable final. Esto significa que se puede ver qué funciones se están ejecutando al utilizar un debugger o ante un [[https://​en.wikipedia.org/​wiki/​Core_dump|"​core dump"​]]. Generalmente es irrelevante si no se utilizan debuggers.
-  * ''​-O2''​ : Le indica al compilador que optimice el código ​''​con nivel de optimización 2'',​ si bien para testing no cambia, casi todas las competencias de programación utilizan este nivel, así que es mejor usarlo para no tener diferencias ​al ejecutar en nuestra ​compu o en el servidor.+  * ''​-O2''​ : Le indica al compilador que optimice el código ​"con nivel de optimización 2". 
 +     * Si bien para testing ​generalmente ​no cambia ​absolutamente nada, casi todas las competencias de programación utilizan este nivel, así que es mejor usarlo para no tener diferencias ​de comportamiento entre nuestra ​computadora y el servidor.
   * ''​-Wconversion''​ : Activa un warning extremadamente útil, que hace que el compilador nos avise si se convierte un tipo en otro de forma tal que se podría perder precisión. Los casos más comunes, que pueden dar lugar a errores en el programa, ocurren al convertir un ''​long long''​ en un ''​int''​ (el valor puede no entrar, ocurriendo overflow), o al convertir un ''​double''​ en algún tipo entero (quizás truncar de esa manera no era la idea del programador). ​   * ''​-Wconversion''​ : Activa un warning extremadamente útil, que hace que el compilador nos avise si se convierte un tipo en otro de forma tal que se podría perder precisión. Los casos más comunes, que pueden dar lugar a errores en el programa, ocurren al convertir un ''​long long''​ en un ''​int''​ (el valor puede no entrar, ocurriendo overflow), o al convertir un ''​double''​ en algún tipo entero (quizás truncar de esa manera no era la idea del programador). ​
-     * Cuando estos warnings señalan conversiones deseadas por el programador (como por ejemplo, ''​int ​= cadena.size();​ ''​),​ basta introducir un [[https://​en.wikipedia.org/​wiki/​Type_conversion|cast]] explícito para eliminar el warning (en el ejemplo anterior, haciendo ''​int ​= int(cadena.size());''​). Simplemente no usar -Wconversion para que no salten ​esos warnings en primer lugar es una solución mucho peor, porque perdemos la posibilidad de detectar rápidamente muchísimos errores en el programa.+     * Cuando estos warnings señalan conversiones deseadas por el programador (como por ejemplo, ''​int ​= cadena.size();​ ''​),​ basta introducir un [[https://​en.wikipedia.org/​wiki/​Type_conversion|cast]] explícito para eliminar el warning (en el ejemplo anterior, haciendo ''​int ​= int(cadena.size());''​). 
 +     ​* ​Simplemente no usar -Wconversion para que no se produzcan ​esos warnings en primer lugar **es una solución mucho peor**, porque perdemos la posibilidad de detectar rápidamente muchísimos errores en el programa.
   * ''​-Wshadow''​ : Activa un warning extremadamente útil, que hace que el compilador nos avise si una variable en un ámbito interno ("​local"​) //oculta// o "​pisa"​ una variable en un ámbito más externo ("​global"​).   * ''​-Wshadow''​ : Activa un warning extremadamente útil, que hace que el compilador nos avise si una variable en un ámbito interno ("​local"​) //oculta// o "​pisa"​ una variable en un ámbito más externo ("​global"​).
      * Muchas veces, esto ocurre como consecuencia de un bug, así que es muy bueno que el compilador nos advierta al respecto. ​      * Muchas veces, esto ocurre como consecuencia de un bug, así que es muy bueno que el compilador nos advierta al respecto. ​
      * Aún cuando no es un bug, generalmente es propenso a errores usar el mismo nombre para la variable global y la variable local, así que es buena idea cambiar uno de los dos nombres.      * Aún cuando no es un bug, generalmente es propenso a errores usar el mismo nombre para la variable global y la variable local, así que es buena idea cambiar uno de los dos nombres.
-  * ''​-Wall''​ : Activa varios "​warnings"​ del compilador extremadamente útiles para detectar errores comunes (por ejemplo cosas como olvidarse el ''​return''​ en una [[curso-cpp:​modularizacion-funciones|función]]) . +  * ''​-Wall''​ : Activa varios "​warnings"​ del compilador extremadamente útiles para detectar errores comunes. Pese a su nombre ​("​all"​) no activa todos los warnings existentes. 
-  ''​-Wextra''​ : Activa aún más "​warnings"​ que la opción anterior (por ejemplo, ​detecta algunos casos de [[https://​en.wikipedia.org/​wiki/​Undefined_behavior|"​undefined behaviour"​]] en tiempo de compilación). +     * Por ejemplocosas como olvidarse el ''​return''​ en una [[curso-cpp:​modularizacion-funciones|función]], o no utilizar nunca una determinada variable (lo que suele indicar que nos olvidamos algo). 
-  * ''​-D_GLIBCXX_DEBUG''​ : Activa verificaciones de "​chequeos de rangos"​ en tiempo de ejecución, para todas las funciones de la [[cpp-avanzado:​stl:​|STL de C++]]. ​+     ​También ​detecta algunos casos de [[https://​en.wikipedia.org/​wiki/​Undefined_behavior|"​undefined behaviour"​]] en tiempo de compilación
 +  * ''​-Wextra''​ : Activa aún más "​warnings"​ que la opción anterior 
 +     * Por ejemplo, advierte si no se utilizan algunos parámetros en una función (de ser intencional,​ basta omitir el nombre del parámetro para silenciar el warning, por ejemplo ''​int foo(int)''​ en lugar de ''​int foo(int x)''​ si el parámetro no se usa). 
 +     * También advierte si se podría estar usando una variable sin inicializarla.  
 +  * ''​-D_GLIBCXX_DEBUG''​ : Activa verificaciones de "​chequeos de rangos"​ en tiempo de ejecución
 +     * Afecta a todas las funciones de la [[cpp-avanzado:​stl:​|STL de C++]]. ​
      * De esta forma, si accede a un ''​vector''​ fuera de rango, o se hace ''​.pop()''​ de una ''​queue''​ vacía (por ejemplo), se obtiene inmediatamente un error en tiempo de ejecución indicando eso, en lugar de que el programa potencialmente falle en forma totalmente silenciosa y difícil de detectar.      * De esta forma, si accede a un ''​vector''​ fuera de rango, o se hace ''​.pop()''​ de una ''​queue''​ vacía (por ejemplo), se obtiene inmediatamente un error en tiempo de ejecución indicando eso, en lugar de que el programa potencialmente falle en forma totalmente silenciosa y difícil de detectar.
      * Esta opción no afecta en absoluto a los punteros y arreglos de C plano, que no son chequeados.      * Esta opción no afecta en absoluto a los punteros y arreglos de C plano, que no son chequeados.
-     * Esta opción hace que sean más lentas las funciones de la STL. En particular, [[cpp-avanzado:​priority-queue]] se vuelve **mucho** más lenta (operaciones $O(N)$ en lugar de $O(\ļg N)$). Como normalmente ejecutamos el código en un juez externo y no en nuestra computadora local, esto no es un problema en absoluto y la ventaja de detectar errores más fácil realmente vale muchísimo la pena. Pero de darse casos particulares en los cuales queramos realizar cómputos muy costosos en nuestra computadora local, esto podría convertirse en un factor importante.+     * Esta opción hace que sean más lentas las funciones de la STL. En particular, [[cpp-avanzado:​priority-queue]] se vuelve **mucho** más lenta (operaciones $O(N)$ en lugar de $O(\lg N)$). Como normalmente ejecutamos el código en un juez externo y no en nuestra computadora local, esto no es un problema en absoluto y la ventaja de detectar errores más fácil realmente vale muchísimo la pena. Pero de darse casos particulares en los cuales queramos realizar cómputos muy costosos en nuestra computadora local, esto podría convertirse en un factor importante.
cpp-avanzado/opciones-gcc.1511663074.txt.gz · Última modificación: 2017/11/26 02:24 por santo