Publicidade

Aula 33: Dicionário de Erros de Compilação

Um catálogo de erros de compilação em C e como corrigi-los — seu guia completo para ler mensagens de erro do gcc.

📖 O que você vai aprender nesta página
✅ Essenciais que você precisa saber
  • Leia a primeira mensagem de erro primeiro
  • Ponto e vírgula e chaves faltando são a causa mais comum
  • Incompatibilidades de tipo e declarações ausentes
⭐ Leia se tiver tempo
  • "undefined reference" (erros de linker)
  • Avisos de shadow
  • Esquecer de incluir um header

Erros de Sintaxe — A Causa #1 de Compilação que Falha

Quando o gcc detecta um erro de sintaxe, ele imprime uma mensagem error: no formato arquivo:linha: error: mensagem.
error: expected ';' before '}' token
Causa: Um ponto e vírgula ; ausente no final de uma instrução. Verifique a linha imediatamente acima da linha reportada.
int x = 10    // ← sem ; aqui
printf("%d", x);  // ← erro reportado aqui
Regra prática: Sempre verifique a linha anterior à linha do erro, e não apenas a linha do erro em si.
error: expected ')' before ';' token
Causa: Parênteses () desbalanceados. Conte com cuidado os que fecham.
printf("x=%d\n", x;  // ← falta )
printf("x=%d\n", x);  // ← OK
error: stray '\343' in program
Causa: Caracteres de largura completa (espaços ou parênteses em largura completa) se infiltraram. São difíceis de ver a olho nu, o que os torna bugs traiçoeiros.
int x = 10; // ← espaço de largura completa entre = e 10!
int x = 10;  // ← OK (espaço de largura normal)
Se vir stray '\343', é quase sempre um caractere de largura completa. Ative "mostrar espaços de largura completa" no seu editor.
error: 'else' without a previous 'if'
Causa: {} desbalanceadas em volta do if, deixando o else órfão.
if (x > 0) {
  printf("positive\n");
}} // ← uma } a mais -> else órfão
else { ... }

Erros de Tipo — Declarações e Incompatibilidades

Erros causados por declarações ausentes ou incompatibilidades de tipo.
error: 'x' undeclared (first use in this function)
Causas comuns:
(1) A variável nunca foi declarada
(2) O nome está escrito errado (countcont)
(3) A variável é usada fora do seu escopo (referenciada fora do bloco onde foi declarada)
(4) Um #include ausente (por exemplo, printf fica undeclared sem <stdio.h>)
error: incompatible types when assigning to type 'int' from type 'char *'
Causa: Os tipos dos dois lados da atribuição são incompatíveis.
int x = "hello"; // Errado: atribuindo string a int
int x = 42;       // OK
error: too few / too many arguments to function 'foo'
Causa: O número de argumentos na chamada não corresponde à declaração.
int add(int a, int b) { return a+b; }

add(1);         // Errado: poucos (precisa 2, passou 1)
add(1,2,3);     // Errado: muitos (precisa 2, passou 3)
add(1,2);       // OK
error: void value not ignored as it ought to be
Causa: Você está tentando atribuir o "resultado" de uma função que retorna void a uma variável.
void greet() { printf("Hi\n"); }
int r = greet(); // Errado: void não tem valor de retorno

Avisos — Compila, Mas É Arriscado

Avisos não impedem a compilação, mas frequentemente sinalizam bugs ocultos. Ative todos com -Wall.
gcc -Wall program.c -o program  // mostra todos os avisos
warning: implicit declaration of function 'printf'
Causa: Falta #include <stdio.h>.
warning: format '%d' expects type 'int', but argument 2 has type 'double'
Causa: O especificador de formato do printf não bate com o tipo do argumento.
double pi = 3.14;
printf("%d\n", pi);  // Errado: use %f para double
printf("%f\n", pi);  // OK
warning: unused variable 'x'
Causa: Uma variável declarada nunca é usada. Remova-a ou verifique se você pretendia usá-la em algum lugar.
warning: control reaches end of non-void function
Causa: Uma função não-void tem um caminho de código que não executa return.
int max(int a, int b) {
  if (a > b) return a;
  // sem return no ramo else!
}
warning: suggest parentheses around assignment used as truth value
Causa: Você usou = (atribuição) dentro de um if. Quis dizer ==?
if (x = 5)  // aviso! isso é atribuição
if (x == 5) // OK: comparação

Quiz de Decodificação de Erros

Leia a mensagem de erro do gcc e tente identificar a causa.
Pergunta
Publicidade
← Aula anterior
Aula 32: Algoritmos de Ordenação
Próxima aula →
Aula 34: Erros em Execução & Segfault

Aulas relacionadas

Laços, Arrays, Strings
Aula 17: Técnicas de Depuração
Como depurar programas em C. Cobertura prática de depuração com printf e bugs comuns.
Referência
Aula 34: Erros em Execução e Segfaults
Causas de segmentation faults em C e como corrigi-los.

FAQ

P. Qual a causa mais comum de erros de compilação?

R. De longe, a mais comum é um ponto e vírgula ausente (;). Depois vêm parênteses desbalanceados e caracteres de largura completa se infiltrando no código-fonte. Ao ler mensagens de erro, sempre verifique também a linha anterior à que a mensagem aponta.

P. Não entendo as mensagens de erro. O que olhar?

R. Mensagens de erro seguem o formato "arquivo:linha: error: mensagem". (1) Verifique o nome do arquivo e o número da linha e (2) leia a descrição depois de "error". Se a descrição for difícil de entender, colar a mensagem inteira em uma busca na web funciona muito bem.

P. Qual a diferença entre error e warning?

R. Um error interrompe a compilação e precisa ser corrigido. Um warning deixa a compilação prosseguir, mas sinaliza um problema potencial. Em desenvolvimento profissional, corrigir avisos é prática padrão.

P. Como eu corrijo um erro "undeclared identifier"?

R. O erro indica que uma variável ou função não foi declarada. Correções comuns: (1) adicionar um #include ausente, (2) declarar a variável antes de usá-la, ou (3) verificar a ortografia. Esquecer stdio.h, em particular, é muito comum.

Quiz

Confira seu entendimento.

Q1. O que causa um erro "undeclared identifier"?

A variável não foi declarada
Um ponto e vírgula está faltando
O tipo está errado

Ocorre quando a variável ou função usada nunca foi declarada. Erros de digitação e um #include ausente também são causas comuns.

Q2. Onde um erro de ponto e vírgula ausente costuma ser reportado?

Na linha que está sem o ponto e vírgula
Na linha seguinte (frequentemente deslocado em um)
No topo do arquivo

O compilador muitas vezes reporta o erro na linha depois do ponto e vírgula ausente. Sempre verifique também as linhas ao redor.

Q3. Diferença entre warning e error?

Sem diferença
A compilação tem sucesso apesar dos warnings
Warnings são mais graves

Um error interrompe a compilação; um warning não. Mas você ainda deve corrigir os warnings.

Compartilhe este artigo
Compartilhar no X Compartilhar no Facebook