====== Opciones de compilación C++ ====== Este paso es opcional, y si ya está instalado adecuadamente el [[curso-cpp:|compilador C++]], [[https://www.geany.org/|Geany]] ya funcionará adecuadamente sin necesidad de llevarlo a cabo. Sin embargo, recomendamos realizar este paso para configurar algunas opciones para el compilador, que **ayudan a detectar errores muy comunes al programar**, más fácilmente. Basta con realizar la configuración siguiente **una única vez**, y ya quedará así configurada automáticamente para todos los programas C++ que escribamos. ===== Configuración de compilación en Geany ===== 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=gnu++11 -g -O2 -Wconversion -Wshadow -Wall -Wextra -D_GLIBCXX_DEBUG -c "%f" Hacemos lo mismo con la línea que está inmediatamente debajo, “Construcción” / “Build”, reemplazándola por lo siguiente: g++ -std=gnu++11 -g -O2 -Wconversion -Wshadow -Wall -Wextra -D_GLIBCXX_DEBUG -o "%e" "%f" 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 ===== **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++ 8-), se resume a continuación una explicación de cada opción propuesta. * ''-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. * ''-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). * Cuando estos warnings señalan conversiones deseadas por el programador (como por ejemplo, ''int N = 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 N = 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"). * 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. * ''-Wall'' : Activa varios "warnings" del compilador extremadamente útiles para detectar errores comunes. Pese a su nombre ("all") no activa todos los warnings existentes. * Por ejemplo, cosas 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). * 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. * 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(\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.