¿Qué hace “-Wall” en “g ++ -Wall test.cpp -o test”?

92

-o cambia el nombre del archivo de salida (encontré que usando --help)

¿Pero no puedo averiguar qué -Wallhace?

Steven
fuente
7
"man gcc" en su consola le dice todo sobre esta bandera y una simple búsqueda en Google con "gcc -Wall" también ...
David Sauter
Como consejo general, intente leer las manentradas de los programas si desea saber qué hace un interruptor o qué interruptores están disponibles. La manpágina de gccse puede leer en linux.die.net/man/1/gcc - puede hacer una búsqueda rápida allí para el texto "-Wall"
gnud
6
@David Sauter, Google no encontrará nada con "-wall". Excluirá todos los "muros" de la búsqueda.
Kirill V. Lyadvinsky
@Kirill No si usas comillas, como supongo que quiso decir David
gnud
1
//, siempre pensé que era un homenaje a Larry Wall.
Nathan Basanese

Respuestas:

110

Es la abreviatura de "advertir a todos": activa (casi) todas las advertencias que g ++ puede informarle. Normalmente es una buena idea, especialmente si eres un principiante, porque comprender y corregir esas advertencias puede ayudarte a solucionar muchos tipos diferentes de problemas en tu código.

MatrixFrog
fuente
24
Se pueden activar más advertencias (algunas de las cuales son bastante útiles) con -Wextray -pedantic.
gnud
7
No es (casi) todo. En realidad, es solo una fracción muy pequeña de las advertencias disponibles. Son los que "todos" están de acuerdo. La muy buena idea es hacerlo -Wall -Wextray luego leer detenidamente el manual para encontrar tantas advertencias más que pueda habilitar, porque incluso -Wextraes solo un pequeño subconjunto ...
DevSolar
@DevSolar muy buen punto. ¿Sabes si hay una bandera que significa "literalmente todas las advertencias"?
MatrixFrog
1
@MatrixFrog: Desafortunadamente, no existe tal opción, al menos no para los compiladores que conozco. Y la lista de advertencias disponibles cambia con el tiempo ... si el equipo de GCC no se hubiera desactivado hace -Wunreachable-codealgún tiempo, Apple estaría mucho más feliz en estos días. ;-)
DevSolar
36

Ver man gcc.

-Wall enciende estas advertencias:

-Waddress -Warray-bounds (only with -O2) -Wc++0x-compat -Wchar-subscripts
-Wenum-compare (in C/Objc; this is on by default in C++) -Wimplicit-int (C and
 Objective-C only) -Wimplicit-function-declaration (C and Objective-C only) 
-Wcomment -Wformat -Wmain (only for C/ObjC and unless -ffreestanding) 
-Wmissing-braces -Wnonnull -Wparentheses -Wpointer-sign -Wreorder -Wreturn-type 
-Wsequence-point -Wsign-compare (only in C++) -Wstrict-aliasing 
-Wstrict-overflow=1 -Wswitch -Wtrigraphs -Wuninitialized -Wunknown-pragmas 
-Wunused-function -Wunused-label -Wunused-value -Wunused-variable 
-Wvolatile-register-var

-Wextra contiene:

-Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers
-Wmissing-parameter-type (C only) -Wold-style-declaration (C only) -Woverride-init
-Wsign-compare -Wtype-limits -Wuninitialized -Wunused-parameter (only with -Wunused
 or -Wall) -Wunused-but-set-parameter (only with -Wunused or -Wall)

Hay muchas más advertencias que debe activar explícitamente.

Por ejemplo, para nuestro código C usamos:

-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wdisabled-optimization -Wdiv-by-zero -Wendif-labels -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimplicit -Wimport -Winit-self -Winline -Winvalid-pch -Wjump-misses-init -Wlogical-op -Werror = llaves-faltantes -Wmissing-declaraciones -Wno-missing-format-attribute -Wmissing-include-dirs -Wmultichar -Wpacked -Wpointer-arith -Wreturn-type -Wsequence-point -Wsign-compare -Wstrict-aliasing -Wstrict-aliasing = 2 -Wswitch -Wswitch-default -Werror = undef -Wno-unused -Wvariadic-macros -Wwrite-strings -Wc ++ -compat -Werror = declaración-tras-declaración -Werror = declaración-de-función-implícita -Wmissing-prototypes -Werror = externs-anidados -Werror = definición-de-estilo-antiguo -Werror = prototipos-estrictos

o simplemente el conjunto de advertencias con https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html

rurbano
fuente
19

Lamentablemente, ninguna de las respuestas cita la parte realmente relevante del manual, lo que realmente lo lleva a un punto:

Esto habilita todas las advertencias sobre construcciones que algunos usuarios consideran cuestionables y que son fáciles de evitar (o modificar para evitar la advertencia), incluso en conjunto con macros.

[...]

Tenga en cuenta que algunos indicadores de advertencia no están implícitos en -Wall. Algunos de ellos advierten sobre construcciones que los usuarios generalmente no consideran cuestionables, pero que ocasionalmente es posible que desee verificar; otros advierten sobre construcciones que son necesarias o difíciles de evitar en algunos casos, y no existe una forma sencilla de modificar el código para suprimir la advertencia. Algunos de ellos están habilitados por -Wextra pero muchos de ellos deben habilitarse individualmente.

Es decir:

  • -Wallno no significa "todas las advertencias".
  • Tampoco no significa "(casi) todo", no por un tiro largo.
  • Que no quiere decir un conjunto de opciones individuales que está obligado a cambiar .

En pocas palabras, se trata del mínimo absoluto de advertencias que debe establecer. Si bien -Wall -Wextraes mejor, todavía no está haciendo uso de todo el error que puede hacer el compilador por usted.


Personalmente, no iría por menos de -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual. Todos mis proyectos actuales utilizan una lista de advertencias más larga que eso (sin activar ninguna de ellas). Y reviso el manual en cada versión importante para conocer nuevas opciones. El compilador es tu amigo. Utilice todos los diagnósticos que pueda ofrecerle.

DevSolar
fuente
Empecé a aprender a programar usando C ++. Estoy usando principios de programación y practico usando cpp . Mi sistema es ubuntu 16.04, uso vscode como editor. ¿Me recomiendan usar su -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtualmientras compilo g++ -std=c++11mientras aprendo C ++ y programación? ¿O debería omitir esta parte y comenzar a usar indicadores de mensajes de error más adelante? Si es así, ¿cuándo debo comenzar con los mensajes de error?
scientific_explorer
2
@vkv: Creo que el compilador es realmente tu amigo, y deberías aprovechar cada pequeño consejo que pueda darte.
DevSolar
6

Permite advertencias que los escritores de gcc consideran útiles y fáciles de evitar en la fuente. También hay -W (-Wextra en las versiones más recientes) que se consideran útiles pero para los que solucionar falsos positivos puede ser difícil o resultar en un código torpe.

gcc también tiene un montón de otras advertencias, generalmente menos útiles. Ver http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Warning-Options.html#Warning-Options

Un programador
fuente
2

Eso enables most warning messages.

Puede obtener más información si usa g++ --help=warnings.

Yuval
fuente
0

Activa todas las advertencias. (se lee como "Advertencia a todos")

Bjorn J
fuente
En realidad, hay muchas advertencias que no habilita (como dtor no virtual en una clase con métodos virtuales).
Mark B
vea la respuesta de Yuval: -Wallsolo significa "la mayoría de las advertencias" en lugar de "todas las advertencias".
HaxtraZ
-1

Muestra todas las advertencias. Recomendaría usar también -pedanticpara advertir sobre algunas partes no conformes del código.

Kirill V. Lyadvinsky
fuente
Para gcc doc: "Algunos usuarios intentan usar -pedantic para verificar la estricta conformidad de los programas con ISO C. Pronto descubren que no hace exactamente lo que quieren: encuentra algunas prácticas que no son ISO, pero no todas, solo aquellas para las que ISO C requiere un diagnóstico y algunos otros para los que se han agregado diagnósticos ".
Programador
No ofrece una garantía del 100%, pero ayuda.
Kirill V. Lyadvinsky
1
Si no hubiera escrito algunos en lugar de todo en "para advertir sobre todas las partes no conformes", no habría comentado. Pero su formulación actual acaba de difundir la idea errónea contra la que advierte la documentación de gcc.
Programador
Fijo. Pero en la práctica parece más bien "la mayoría de" y no "algunos".
Kirill V. Lyadvinsky