Salut !
Je continue à jouer avec des API en C utilisant des void* pour les wrapper dans des classes C++.
Aujourd'hui, j'ai une fonction C qui attend en paramètre un pointeur sur une fonction prenant un void* en paramètre et ne retournant rien. Je crée un wrapper en C++ dans lequel j'arrive à m'assurer que ce void* sera en fait l'adresse d'un objet. Je souhaite donc écrire un code comme ceci :
Sans reinterpret_cast<>, j'ai l'erreur suivante, qui me parait tout à fait logique : error: invalid conversion from 'void (*)(Foo*)' to 'void (*)(void*)' [-fpermissive]. Le compilateur ne peut pas du tout assurer que ce void* sera en fait un Foo*. Si je peux le garantir (de part la construction de mon programme), est-ce qu'un tel cast est OK ?
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 // ----------------------- // C world using C_callback = void(*)(void*); void registerCallback(C_callback c) { (void) c; } // ----------------------- // C++ world class Foo { public: using Cpp_callback = void(*)(Foo*); Foo(Cpp_callback cpp) { registerCallback(reinterpret_cast<C_callback>(cpp)); } };
Question bonus : que fait la 2e ligne par rapport à la première ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 using C_callback = void(*)(void*); using what_is_it= void(void*);
Partager