Departamento de Ciência da
Computação - IME - USP
O padrão ANSI serve nesse sentido de portabilidade.
Certamente evita comentários com "//", o que por si só não é grave, mas que indica que as outras opções de compilação não estão sendo usadas. Pode servir também para impedir outras construções esquisitas, mas que não sei se isso seria importante.
Olhando em conjunto, o -ansi -pedantic não é tão importante, uma vez que o compilador que a gente está usando, o tal do gcc, é um compilador muito bem comportado no sentido de não dar acesso fácil a particularidades de instalação.
Sempre que um aluno PRECISAR MUITO usar um comando não dado em aula, dá para perceber que a disciplina não conseguiu ensinar direito alguma coisa para ele. Forçar a usar só comandos dados em aula, bem mais restrito do que usar ANSI C, é bom para ter essa avaliação do processo de aprendizado.
Resposta curta: não se preocupe com esse alerta. Esse é o único alerta que você pode ignorar.
Resposta um pouco mais completa: a função scanf() devolve o número que objetos lidos com sucesso. Alguns sistemas dão esse alerta se o valor devolvido por scanf() não é usado no programa.
O valor devolvido por scanf() pode ser usado da seguinte forma (o programa abaixo não gera o alerta em questão):
#include <stdio.h> int main() { int a; if (scanf("%d", &a) != 1) { printf("Falha na leitura de um inteiro\n"); return 1; /* valor diferente de 0 em caso de término inesperado do programa */ } printf("Valor lido: %d\n", a); return 0; }
A compilação do programa a seguir pelo gcc apresenta o aviso:
In function 'main': 10: warning: control reaches end of non-void function
#include <stdio.h> int main() { int a, b, soma; scanf("%d %d", &a, &b); soma = a + b; printf("%d + %d = %d\n", a, b, soma); /* Aqui, no final do programa, falta "return 0;" */ }Falta "return 0;" no final do programa.
A compilação do programa a seguir apresenta os avisos:
In function 'main': 7: warning: too few arguments for format 9: warning: too few arguments for format
#include <stdio.h> int main() { int a, b, soma; scanf("%d %d %d", &a, &b); soma = a + b; printf("%d + %d = %d\n", a, b); return 0; }Na linha 7 há três '%d' e há apenas duas variáveis para serem inicializadas na leitura: a e b. Na linha 9 há um erro idêntico com o printf.
A compilação do programa a seguir apresenta os avisos:
In function 'main': 7: warning: too many arguments for format 9: warning: too many arguments for format
#include <stdio.h> int main() { int a, b, soma; scanf("%d", &a, &b); soma = a + b; printf("%d + %d = \n", a, b, soma); return 0; }Na linha 7 há apenas um '%d' e há duas variáveis para serem inicializadas na leitura: a e b. Na linha 9 há um erro idêntico com o printf.
A compilação do programa a seguir apresenta o aviso:
In function 'main': 8: warning: suggest parentheses around assignment used as truth value
#include <stdio.h> int main() { int a, b; scanf("%d %d", &a, &b); if (a = b) { printf("o conteudo das variaveis sao o mesmo.\n"); } return 0; }Na linha 8 vemos um 'a = b' onde deveria estar um 'a == b'.
A compilação do programa a seguir apresenta o aviso:
In function 'main': 8: error: invalid lvalue in assignment
#include <stdio.h> int main() { int a, b; scanf("%d %d", &a, &b); if (5 > 4 && a = b) { printf("o conteudo das variaveis sao o mesmo.\n"); } return 0; }Na linha 8 vemos um 'a = b' onde deveria estar um 'a == b'.
A compilação do programa a seguir apresenta o aviso:
In function 'main': 5: warning: unused variable 'soma'
#include <stdio.h> int main() { int a, b, soma; scanf("%d %d", &a, &b); printf("%d + %d = %d\n", a, b, a+b); return 0; }A variável 'soma' foi declarada na linha 5, mas não foi utilizada pelo programa.
printf("%d",&x);
.A compilação do programa a seguir apresenta o aviso:
In function 'main': 9: warning: format '%d' expects type 'int', but argument 4 has type 'int *'
#include <stdio.h> int main() { int a, b, soma; scanf("%d %d", &a, &b); soma = a + b; printf("%d + %d = %d\n", a, b, &soma); return 0; }Na linha 9 há um '&' antes da variável 'soma'.
A compilação do programa a seguir apresenta os avisos:
In function 'main': 7: warning: spurious trailing '%' in format 7: warning: too many arguments for format
#include <stdio.h> int main() { int a, b, soma; scanf("%d %", &a, &b); soma = a + b; printf("%d + %d = %d\n", a, b, soma); return 0; }Na linha 7 há um '%' onde deveria estar um '%d'. O outro aviso (too many arguments for format) também é consequência desse mesmo erro.
A compilação do programa a seguir apresenta o aviso:
In function 'main': 9: warning: ISO C90 forbids mixed declarations and code
#include <stdio.h> int main() { int a, b; scanf("%d %d", &a, &b); int soma; soma = a + b; printf("%d + %d = %d\n", a, b, soma); return 0; }Na linha 9 está declarada a variável 'soma', depois do comando de leitura (scanf). No caso, a variável 'soma' deveria ter sido declarada no início do main, junto com as outras variáveis.
A compilação do programa a seguir apresenta os seguintes avisos:
In function 'main': 9: warning: ISO C90 forbids mixed declarations and code
#include <stdio.h> int main() { int i, j, nI; scanf("%d", &nI); int ilha[100][100]; for (i = 0; i < nI; i++) for (j = 0; j < nI; j++) ilha[i][j] = 0; return 0; }Na linha 9 do 'main' foi declarada a matriz ilha entre os comandos scanf e for. A declaração de variáveis deve ser feita no início das funções.
A compilação do programa a seguir apresenta o aviso e erro:
In function 'main': 9: warning: implicit declaration of function 'print' /tmp/ccC14gmU.o: In function 'main': (.text+0x48): undefined reference to 'print' collect2: ld returned 1 exit status
#include <stdio.h> int main() { int a, b, soma; scanf("%d %d", &a, &b); soma = a + b; print("%d + %d = %d\n", a, b, soma); return 0; }Na linha 9 está escrito 'print' em vez de 'printf'. As outras mensagens de erro são consequência desse mesmo erro tipográfico.
#include <stdio.h>
A compilação do programa a seguir apresenta os avisos:
In function 'main': 5: warning: implicit declaration of function 'scanf' 5: warning: incompatible implicit declaration of built-in function 'scanf' 7: warning: implicit declaration of function 'printf' 7: warning: incompatible implicit declaration of built-in function 'printf'
int main() { int a, b, soma; scanf("%d %d", &a, &b); soma = a + b; printf("%d + %d = %d\n", a, b, soma); return 0; }Na linha 5 aparece o 'scanf' e na linha 7 o 'printf'. Os warnings foram gerados pela falta do 'include'.
/* Este e um comentario em C padrao ANSI */
A compilação do programa a seguir apresenta os erros:
In function 'main': 5: error: expected expression before '/' token 12: error: expected expression before '/' token
#include <stdio.h> int main() { int a, b, soma; // declaracao de variaveis /* Este e'um comentario em C padrao ANSI. */ scanf("%d %d", &a, &b); soma = a + b; printf("%d + %d = %d\n", a, b, soma); return 0; // termino do programa }Nas linhas 5 e 12 está sendo usado '//' em vez de '/* <comentário> */'.
A compilação do programa a seguir apresenta o aviso:
9:10: warning: unknown escape sequence: '\040'
#include <stdio.h> int main() { int a, b, soma; scanf("%d %d", &a, &b); soma = a + b; printf("%d + %d = %d\ ", a, b, soma); /* ERRO */ return 0; }Na linha 9 há um '\' no lugar de um '\n'.
A compilação do programa a seguir apresenta o aviso:
In function 'main': 8: warning: 'a' is used uninitialized in this function
#include <stdio.h> int main() { int a, b, soma; b = 2; soma = a + b; /* ERRO */ printf("%d + %d = %d\n", a, b, soma); return 0; }De fato, a variável a foi usada na linha 8, em 'soma = a + b' sem ter sido inicializada. Para que o aviso desapareça, basta inicializar a variável a. Com qual valor inicializar? Com 0? com -134? A resposta é: depende! No exemplo, depende de qual a soma que se deseja fazer no programa. A soma é 0+2? A soma é -134+2?
A compilação do programa a seguir apresenta o aviso:
In function 'main': 5: warning: 'b' may be used uninitialized in this function
#include <stdio.h> int main() { int a, b; printf("Digite 1 ou 2: "); scanf("%d", &a); if (a == 1) { b = 2; } if (a == 2) { b = 1; } b = b + 1; printf("b = %d\n", b); return 0; }O número indicado pelo aviso é o número da linha em que a variável b foi declarada. Para o programador pode ser evidente que a variável b sempre será inicializada, já que ele pede que seja digitado 1 ou 2 na leitura do valor de a. No entanto, para o compilador, que não está a par da lógica do programa, não é evidente que o valor atribuido inicialmente à variável a pela leitura seja 1 ou 2. Por isto, levando em consideração o comando "b = b + 1" o compilador avisa que a variável b pode (may be) estar sendo usada sem ter sido inicializada.
O programa a seguir é menos "rebuscado" e tem o mesmo efeito do programa anterior. Para este, programa o compilador não apresenta aviso algum
#include <stdio.h> int main() { int a, b; printf("Digite 1 ou 2: "); scanf("%d", &a); if (a == 1) { b = 2; } else { b = 1; } b = b + 1; printf("b = %d\n", b); return 0; }
A compilação do programa a seguir apresenta o aviso:
In function 'main': 15: warning: passing argument 1 of 'soma' makes pointer from integer without a cast
#include <stdio.h> /* prototipo da funcao soma */ void soma(int *k); /* main */ int main() { int i; i = 0; while (i < 10) { printf("i = %d\n", i); soma(i); /* ERRO */ } return 0; } /* declaracao da funcao da soma */ void soma(int *k) { *k = *k + 1; }Na linha 15, na função 'main', está faltando um '&' antes da variável 'i', deveria estar escrito 'soma(&i)' em vez de simplesmente 'soma(i)'.
A compilação do programa a seguir apresenta o aviso:
In function 'soma': 24: warning: assignment makes integer from pointer without a cast
#include <stdio.h> /* prototipo da funcao soma */ void soma(int *k); /* main */ int main() { int i; i = 0; while (i < 10) { printf("i = %d\n", i); soma(&i); } return 0; } /* declaracao da funcao soma */ void soma(int *k) { *k = k + 1; /* ERRO */ }Na linha 24, na função soma, está faltando um '*' antes da variável 'k'; deveria estar escrito '*k = *k + 1;' em vez de '*k = k + 1;'.
A compilação do programa a seguir apresenta o aviso:
In function 'main': 15: warning: passing argument 1 of 'soma' from incompatible pointer type
#include <stdio.h> /* prototipo da funcao soma */ void soma(int *k); /* main */ int main() { float x; x = 0; while (x < 10) { printf("x = %f\n", x); soma(&x); /* ERRO */ } return 0; } /* declaracao da funcao soma */ void soma(int *k) { *k = *k + 1; }Na linha 15, na função 'main', a variável passada para a função 'soma' é do tipo float, mas o correspondente parâmetro *k na declaração da função é do tipo "int".
A compilação do programa a seguir apresenta o erro:
In function 'multiplica': 24: error: invalid operands to binary *
#include <stdio.h> /* prototipo da funcao multiplica */ void multiplica(int *k); /* main */ int main() { int i; i = 0; while (i < 10) { printf("i = %d\n", i); multiplica(&i); } return 0; } /* declaracao da funcao multiplica */ void multiplica(int *k) { *k = k * 2; /* ERRO */ }Na linha 24, na função multiplica, está faltando um '*' antes da variável 'k'; deveria estar escrito '*k = *k * 2;' em vez de '*k = k * 2;'.
A compilação do programa a seguir não dá esse warning.
#include <stdio.h> int main() { int a; a = 12; if (a > 0) return 0; else return 1; }Já a compilação do programa abaixo apresenta esse warning:
#include <stdio.h> int main() { int a; a = 12; if (a > 0) return 0; if (a <= 0) return 1; }Pode-se perceber que o segundo main é mais confuso que o primeiro.
<tipo da função> <nome da função>(<lista de parâmetros>) { <variáveis locais> <lista de comandos> }<tipo da função> pode ser, por exemplo, int, float, char ou ainda void.
A compilação do programa a seguir apresenta os seguintes avisos:
4: warning: data definition has no type or storage class 4: warning: type defaults to 'int' in declaration of 'f' 24: warning: return type defaults to 'int'
#include <stdio.h> /* prototipo */ f(float a, float b, int k); /* Falta o tipo da funcao */ /* main */ int main() { int i; float x; i = 0; while (i < 10) { x = f(0,1,i); printf("x = %f\n", x); } return 0; } /* funcao f */ f(float a, float b, int k) { float deltax; deltax = (b - a)/k; return deltax; }Nas linhas 4 e 24 não foi especificado o tipo da função 'f' que, portanto, é suposto como sendo do tipo 'int'.
A compilação do programa a seguir apresenta o seguinte erro:
24: error: expected identifier or '(' before '{' token
#include <stdio.h> /* prototipo */ float f(float a, float b, int k); /* main */ int main() { int i; float x; i = 0; while (i < 10) { x = f(0,1,i); printf("x = %f\n", x); } return 0; } /* funcao f */ float f(float a, float b, int k); /* ERRO: este ';' esta sobrando */ { float deltax; deltax = (b - a)/k; return deltax; }Na linha 23 há um ';' entre o protótipo e o corpo da função. Removendo-se esse ';' o programa compila sem erros ou avisos.
A compilação do programa a seguir apresenta os seguintes erros:
In function 'f': 26: error: 'k' redeclared as different kind of symbol 23: error: previous definition of 'k' was here
#include <stdio.h> /* prototipo */ float f(float a, float b, int k); /* main */ int main() { int i; float x; i = 0; while (i < 10) { x = f(0,1,i); printf("x = %f\n", x); } return 0; } /* funcao f */ float f(float a, float b, int k) { float deltax; int k; /* k ja foi declarado como parametro */ k = k*10; deltax = (b - a)/k; return deltax; }Na linha 26 da função 'f', a variável local de nome k foi declarada, mas já havia um parâmetro com este nome na linha 23 ('int k').
A compilação do programa a seguir apresenta os seguintes erros:
In function 'f': 26: error: 'k' redeclared as different kind of symbol 23: error: previous definition of 'k' was here
#include <stdio.h> /* prototipo */ float f(float a, float b, int *k); /* main */ int main() { int i; float x; i = 0; while (i < 10) { x = f(0,1,&i); printf("x = %f\n", x); } return 0; } /* funcao f */ float f(float a, float b, int *k) { float deltax; int k; /* k ja foi declarado como parametro */ k = k*10; deltax = (b - a)/k; return deltax; }Na linha 26 da função 'f' a variável local de nome k foi declarada, mas já havia uma parâmetro com este nome na linha 23 ('int *k').
A compilação do programa a seguir apresenta os seguintes avisos:
In function 'main': 6: warning: ISO C90 forbids variable-size array 'ilha' 6: warning: ISO C90 forbids variable-size array 'ilha'
#include <stdio.h> int main() { int i, j, nI; int ilha[nI][nI]; /* deveria ser um numero em vez de uma variável */ scanf("%d", &nI); for (i = 0; i < nI; i++) for (j = 0; j < nI; j++) ilha[i][j] = 0; return 0; }Na linha 6 do 'main' foi usada a variável nI para indicar a dimensão da matriz ilha. Em vez de uma váriavel como nI, a declaração deve usar um número, por exemplo "int ilha[100][100];".
É importante que programas não apresentem avisos durante a compilação, já que, frequentemente, avisos na verdade indicam erros de lógica. No entanto, este aviso em particular, pode ser ignorado...
Segundo uma mensagem no mailing list for the GCC project, o padrão da linguagem C recomenda que um arquivo com um programa termine com o caractere "new-line", que não deve ser imediatamente precedido de backslash ('\'). Como isto é uma recomendação, os desenvolvedores do compilador fazem com que uma mensagem de violação dessa recomendação seja emitida.
/* Colaboração de Henrique dos Reis Cadioli */ #include <stdio.h> void f(int a) { a = a + 1; } int main () { int a,b; b = 5; a = f(b); printf("a = %d\n", a); return 0; }
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.