Código ainda corre sem qualquer inclui (de Bloodshed Dev-C ++)
-
06-07-2019 - |
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 include
s, ou seja, tornando-a mais um bocado "rigorosa"?
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.