Esta questão vem de uma tentativa de entender a "filosofia C" e não de nenhum "problema real".
Suponha que em um programa C eu use sin(x):
#include <stdio.h>
int main() {
char s[20] = "aha";
printf("%f", sin(s));
return 0;
}
Cometi dois erros deliberadamente:
- Não
#include
editei math.h (nem forneci nenhuma declaração para pecado). - Eu fiz
s
um tipochar *
(apenas algo que não pode ser convertido significativamente para umdouble
).
Eu compilo usando GCC com o -lm
sinalizador.
Como esperado, recebo um aviso e um erro.
Claro, há o aviso de declaração implícita de função blá blá blá:
bad.c: In function ‘main’:
bad.c:5:15: warning: implicit declaration of function ‘sin’ [-Wimplicit-function-declaration]
5 | printf("%f", sin(s));
| ^~~
bad.c:5:16: warning: incompatible implicit declaration of built-in function ‘sin’
bad.c:2:1: note: include ‘<math.h>’ or provide a declaration of ‘sin’
1 | #include <stdio.h>
+++ |+#include <math.h>
Uma pequena pesquisa parece indicar que se uma função não for declarada previamente, então C assume uma "declaração padrão" (a chamada "declaração implícita") que é como int undeclaredfunction(void)
.
Mas também recebo o seguinte erro:
2 |
bad.c:5:19: error: incompatible type for argument 1 of ‘sin’
5 | printf("%f", sin(s));
| ^
| |
| char *
bad.c:5:20: note: expected ‘double’ but argument is of type ‘char *’
Isso mostra que a "declaração implícita" espera um argumento do tipo double
.
- Parece que C mantém uma lista de "declarações implícitas" corretas para "funções padrão". Onde posso encontrar a lista abrangente de tais declarações implícitas corretas para um determinado compilador (digamos
gcc
ouclang
)? - Se C já tem as declarações corretas das funções matemáticas padrão incorporadas, então por que ele espera que o programador as tenha
#include<math.h>
? Só por tradição? Ou por limpeza?
A(s) resposta(s) que procuro são sobre as regras exatas usadas pelo compilador, e não sobre comentários subjetivos sobre "boas práticas de programação".