Pergunta

Atualmente, estou aprendendo e experimentando com C e estou usando DEV-C do Bloodshed ++ como um IDE.

Agora, eu só percebi que o seguinte pedaço de código (como é ... não inclui ou nada) compila e roda:

main ()
{
    printf("%d", strlen("hello"));  
}

Agora, se eu não estou enganado, não deve dois arquivos de cabeçalho ser incluídos nesta fonte para que ele funcione? stdio.h e string.h ... mas como você pode ver, eu não adicioná-los e o código ainda compilado e executado com êxito.

A minha queixa é que eu quero que o compilador para ser "rigorosa", porque desde que eu ainda estou aprendendo C, eu não quero o código para executar se normalmente ele não deveria.

Então, há alguma maneira de impedir que Dev-C ++ a partir de 'corrigir meus erros' quando se trata de includes, ou seja, tornando-a mais um bocado "rigorosa"?

Foi útil?

Solução

C90 tinha uma característica (ausente de C99 e C ++) chamada implícita declaração da função: quando você usou um nome não declarado ainda em uma chamada de função, o compilador se comportavam como se

extern int identifier();

tinha sido visto. Essa característica tem sido caiu de C99 e a maioria dos compiladores tinha opção para avisar sobre isso antes mesmo de C99 foi promulgada.

estilo Mesmo quando ficar em C90, não é recomendado para usar isto. Se você tem que manter o código fazendo uso desta e não pode adicionar protótipos, verifique se:

  • as funções retorna um int (é o caso de printf, mas a validade é dependente de implementação de strlen, que retorna um size_t que pode ser int ou qualquer outra coisa)

  • a função não é variádica (é o caso de strlen, mas não printf)

  • o tipo de argumentos não é modificado por promoções de argumento padrão (char, short, flutuador são) e você deve prestar atenção aos ponteiros do elenco para void * quando necessário quando o tipo esperado é void *, você tem que prestar atenção a NULL elenco para o tipo de ponteiro correta. (Estas são as mesmas coisas que você precisa prestar atenção para os argumentos variádicos BTW).

Se essas condições não forem cumpridas - e eles não são para todas as chamadas em seu código -. Você entra no reino do comportamento indefinido

Outras dicas

Eu não sei se este é realmente questão um DevC ++, mas em qualquer caso, você deve considerar afundamento ele. Ele não está mais sendo desenvolvido e é muito buggy. Eu recomendo mudar para Code :: Blocks , que é melhor em todos os sentidos e alows que você use a mais recente compilador GCC.

Uma das possibilidades para 'comportamento indefinido' - que você ganha se você chamar uma função variádica sem um protótipo visível -. É que seus compila o código e é executado com sucesso

Se você estiver usando gcc como compilador subjacente, então você deve ser capaz de passar bandeiras como -std=c89 -pedantic -Wall -Wextra e obter alguns avisos sobre o código, como o trecho que você postou.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top