Por que a compilação do código C no Xubuntu falha?

2

Recentemente, fiz uma nova reinstalação do sistema operacional - troquei do openSUSE para o Xubuntu. Eu tinha feito backup de todos os meus scripts de pós-processamento de dados científicos (escritos em C ou em FORTRAN). O código que usei recentemente e funcionou sem erros no SUSE fornece erros relacionados principalmente à saída de dados de caracteres ... ajuda!

exemplo de mensagem de erro:

FBDcode.c:144:2: warning: format ‘%s’ expects argument of type ‘char *’,  
                 but argument 3 has type ‘char (*)[100]’ [-Wformat]

a linha 144 no meu arquivo .c é:

fscanf(infile_PP, "%s %lf\n", &temp_str, &solvent_molec_wt);

variável temp_str é definido anteriormente desta maneira:

char temp_str[100];
    
por user125222 22.01.2013 / 19:00

1 resposta

4

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

    
por chaskes 22.01.2013 / 21:22