GCC opções · 5 min read · Jan 22, 2026
Opções de linha de comando GCC incomuns, mas úteis - parte 2
O compilador gcc oferece uma lista aparentemente interminável de opções de linha de comando. Claro, ninguém usa ou tem expertise em todas elas, mas há um grupo seleto que todo usuário de gcc deve - se não obrigatoriamente - conhecer. Enquanto algumas delas são comumente usadas, outras são um pouco incomuns, mas não menos úteis.
Nesta série de artigos, estamos focando em algumas dessas opções de linha de comando gcc incomuns, mas úteis, e já cobrimos algumas delas na parte 1.
Se você se lembra, no início da primeira parte desta série de tutoriais, mencionei brevemente que a opção -Wall que os desenvolvedores geralmente usam para gerar avisos não cobre alguns avisos específicos. Se você não está ciente desses avisos e não tem ideia de como ativá-los, não se preocupe, pois explicaremos tudo isso em detalhes neste artigo.
Além disso, também abordaremos uma opção de aviso do gcc relacionada a variáveis de ponto flutuante, bem como como gerenciar melhor as opções de linha de comando do gcc se a lista crescer muito.
Mas antes de prosseguirmos, por favor, tenha em mente que todos os exemplos, comandos e instruções mencionados neste tutorial foram testados no Ubuntu 16.04 LTS, e a versão do gcc que usamos é 5.4.0.
** Ativar avisos que não são cobertos por -Wall
Embora a opção -Wall do compilador gcc cubra a maioria das flags de aviso, há algumas que permanecem desativadas. Para ativá-las, use a opção -Wextra.
Por exemplo, veja o seguinte código:
#include
#include
int main()
{
int i=0;
/* ...
algum código aqui
...
*/
if(i);
return 1;
return 0;
} Eu acidentalmente coloquei um ponto e vírgula após a condição ‘if’. Agora, quando o código foi compilado usando o seguinte comando gcc, nenhum aviso foi produzido.
gcc -Wall test.c -o testMas quando a opção -Wextra foi usada:
gcc -Wall -Wextra test.c -o testUm aviso foi produzido:
test.c: In function ‘main’:
test.c:10:8: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
if(i);Como é claro a partir do aviso mostrado acima, a opção -Wextra habilitou internamente a flag -Wempty-body, que por sua vez detectou o código suspeito e emitiu o aviso. Aqui está a lista completa de flags de aviso ativadas por esta opção:
-Wclobbered, -Wempty-body, -Wignored-qualifiers, -Wmissing-field-initializers, -Wmissing-parameter-type (apenas C), -Wold-style-declaration (apenas C), -Woverride-init, -Wsign-compare, -Wtype-limits, -Wuninitialized, -Wunused-parameter (apenas com -Wunused ou -Wall), e -Wunused-but-set-parameter (apenas com -Wunused ou -Wall).
Se você quiser saber o que as flags mencionadas acima fazem, acesse a página do manual do gcc.
Seguindo em frente, a opção -Wextra também emite avisos nos seguintes casos:
- Um ponteiro é comparado com zero inteiro usando <, <=, > ou >=
- (apenas C++) Um enumerador e um não enumerador aparecem em uma expressão condicional.
- (apenas C++) Bases virtuais ambíguas.
- (apenas C++) Indexando um array que foi declarado como register.
- (apenas C++) Pegando o endereço de uma variável que foi declarada como register.
- (apenas C++) Uma classe base não é inicializada no construtor de cópia de uma classe derivada.
Ativar aviso para valores de ponto flutuante em comparações de igualdade
Como você já deve saber, nunca se deve testar a igualdade exata de valores de ponto flutuante (não sabia disso - leia a FAQ relacionada a comparação de ponto flutuante aqui). Mas mesmo que você acidentalmente faça isso, o compilador gcc lança algum aviso ou erro? Vamos verificar:
Aqui está um código que compara variáveis de ponto flutuante usando o operador ==:
#include
void compare(float x, float y)
{
if(x == y)
{
printf("\n IGUAL \n");
}
}
int main(void)
{
compare(1.234, 1.56789);
return 0;
} E aqui está o comando gcc (contendo as opções -Wall e -Wextra) usado para compilar este código:
gcc -Wall -Wextra test.c -o testInfelizmente, o comando acima não produz nenhum aviso relacionado à comparação de ponto flutuante. Uma rápida olhada na página do manual do GCC revela que existe uma opção dedicada -Wfloat-equal que deve ser usada nesses cenários.
Aqui está o comando contendo esta opção:
gcc -Wall -Wextra -Wfloat-equal test.c -o testE a seguir está a saída que produziu:
test.c: In function ‘compare’:
test.c:5:10: warning: comparing floating point with == or != is unsafe [-Wfloat-equal]
if(x == y)Então, como você pode ver na saída acima, a opção -Wfloat-equal forçou o gcc a produzir um aviso relacionado à comparação de ponto flutuante.
Aqui está o que a página do manual do gcc diz sobre esta opção:
A ideia por trás disso é que às vezes é conveniente (para o programador) considerar valores de ponto flutuante como aproximações a números reais infinitamente precisos. Se você estiver fazendo isso, então precisa calcular (analisando o código, ou de alguma outra forma) o erro máximo ou provavelmente máximo que a computação introduz, e permitir isso ao realizar comparações (e ao produzir saída, mas esse é um problema diferente). Em particular, em vez de testar a igualdade, você deve verificar se os dois valores têm intervalos que se sobrepõem; e isso é feito com os operadores relacionais, então comparações de igualdade provavelmente estão erradas.Como gerenciar melhor as opções de linha de comando do gcc
Se a lista de opções de linha de comando que você está usando em seu comando gcc está se tornando maior e difícil de gerenciar, então você pode colocá-la em um arquivo de texto e passar o nome desse arquivo como um argumento para o comando gcc. Para isso, você terá que usar a opção @file.
Por exemplo, se o seguinte é seu comando gcc:
gcc -Wall -Wextra -Wfloat-equal test.c -o testEntão você pode colocar as três opções relacionadas a avisos em um arquivo chamado, digamos, ‘gcc-options’:
$ cat gcc-options
-Wall -Wextra -Wfloat-equalE seu comando gcc se torna menos confuso e fácil de gerenciar:
gcc @gcc-options test.c -o testAqui está o que a página do manual do gcc diz sobre @file:
Leia opções de linha de comando do arquivo. As opções lidas são inseridas no lugar da opção original @file. Se o arquivo não existir ou não puder ser lido, então a opção será tratada literalmente e não será removida.
As opções no arquivo são separadas por espaços em branco. Um caractere de espaço em branco pode ser incluído em uma opção cercando toda a opção com aspas simples ou duplas. Qualquer caractere (incluindo uma barra invertida) pode ser incluído prefixando o caractere a ser incluído com uma barra invertida. O arquivo pode conter opções @file adicionais; quaisquer opções desse tipo serão processadas recursivamente.Conclusão
Então cobrimos um total de 5 opções de linha de comando gcc incomuns, mas úteis nesta série de tutoriais: -save-temps, -g, -Wextra, -Wfloat-equal e @file. Dedique um tempo para praticar cada uma delas e não se esqueça de passar por todos os detalhes que a página do manual do gcc oferece sobre elas.
Você conhece ou usa outras opções de linha de comando gcc úteis e quer compartilhá-las com o mundo? Deixe todos os detalhes nos comentários abaixo.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.