Bonjour,
en C il y a des casts implicites entre "void*" et les autres types de pointeurs que ce soit dans des affectations directes, ou lors du passage en paramètre à une fonction .
En revanche le cast implicite dans le cas du passage de paramètre n'est plus valable quand c'est un pointeur vers la fonction qui est considéré :
Les casts implicites par affectations directes ne provoquent pas de warnings :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #include <stdlib.h> void f(int* p) { p = NULL; return; } void fp(void (*p)(void*)) { p = NULL; return; } int main(void) { void* p_void = NULL; int* p_int = p_void; p_void = p_int; f(p_void); f(p_int); fp(f); return EXIT_SUCCESS; }
Les casts qui ont lieu lors du passage en paramètre non plus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2int* p_int = p_void; p_void = p_int;
En revanche la ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 f(p_void); f(p_int);
provoque le warning de compilation suivante avec gcc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part fp(f);
Pourquoi le système de typage devient il aussi restrictif au niveau du typage des fonctions ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part warning: passing argument 1 of fp from incompatible pointer type
A priori la fonction "f" peut être invoquée indifferemment avec "int*" ou "void*" .
Merci .
Partager