Por que o código gera avisos
Você deseja transmitir temp_str
sem o & amp; , pois as matrizes são passadas por referência por padrão.
Se você precisar passar um membro específico i
da matriz, poderá transmitir &temp_str[i]
sem avisos, incluindo &temp_str[0]
.
Por que o código é compilado no openSUSE, mas gera um aviso no Ubunutu
Eu tenho o openSUSE 12.2 e o Ubuntu 12.10 no meu computador e tentei de várias maneiras. Ambos usam o gcc 4.7.1.
O openSUSE não gera o aviso do compilador porque os avisos apropriados não estão ativados por padrão. Se você compilar seu código no openSUSE com avisos (mais comumente -Wall
), você verá o mesmo aviso do compilador que você faz no Ubuntu.
O Ubuntu usa dpkg-buildflags para definir as configurações padrão. Por padrão, o Ubuntu usa -Wformat
(que está gerando o aviso sobre fscanf
e seria incluído quando usar -Wall
) e -Werror=format-security
, o que transforma avisos de -Wformat-security
em erros (e não não incluído em -Wall
).
Você pode visualizar essas configurações no terminal com dpkg-buildflags --dump
e dpkg-buildflags --status
.
O que são avisos do compilador?
Os codificadores aprendem rapidamente sobre erros do compilador. Quando o código tem erros de digitação, erros de sintaxe ou o compilador é capaz de detectar outros problemas, o compilador emite erros e pára. Nestes casos, dizemos que o código não será compilado.
Mas há muitos mais casos em que o compilador acha que pode haver um erro ou percebe um código legal que pode ter alguns problemas. Nesses casos, o compilador emite avisos, mas geralmente conclui a compilação do código.
É importante observar os avisos. Na maioria das vezes, os avisos devem ser tratados como erros e corrigidos mesmo quando o código é compilado. Se os avisos forem ignorados ou não forem vistos em primeiro lugar, o programador pode achar falsamente que não há nada errado com o código. O código resultante pode ser executado corretamente ou parecer estar funcionando bem. Mas esses avisos muitas vezes significam que há um problema esperando para acontecer. Quando as condições mudam mais tarde, o código pode produzir o resultado errado ou mesmo levar a um comportamento indefinido, causando falhas. É muito difícil encontrar esse tipo de bug porque o programador está partindo do pressuposto de que o código não tem problemas.
No gcc, a opção de linha de comando -Wall mostra a maioria dos avisos. Opções que começam com -W são sobre avisos. Estas estão na página man. Neste caso -Wall mostra todos os avisos (realmente mais). É uma boa ideia usar sempre a opção -Wall. A documentação do GNU gcc tem muito mais informações sobre avisos e configurações.
Um excelente livro novo que explica como usar arquivos Make e outras ferramentas para definir opções de compilação é 21st Century C de O'Reilly Media, outro livro muito bom é Autotools da No Starch Press