2014-06-05 3 views
2

J'ai un problème avec une librairie qui est écrite en C et mon propre code en C++, le problème semble être qu'il y a un pointeur de fonction qui est déclaré comme externe "C" mais pointe vers une fonction C++ (dans mon cas le pointeur NULL quand j'appelle la fonction de la librairie) qui n'est pas déclarée externe "C".Extern "C" Pointeur de fonction NULL

maintenant dans le code:

function_from_lib(... , (int (*)()) NULL); 

Eh bien là, vous pouvez voir que je passe le functionpointer à la fonction. Le problème est que j'ai besoin d'un pointeur de fonction qui pointe également vers NULL mais la fonction à laquelle les points "NULL" (stupide) doivent être déclarés comme extern "C". Est-ce que quelqu'un sait comment résoudre un tel problème ou une solution de contournement? Je n'ai pas la moindre idée de la façon dont la fonction regarde à l'intérieur, mais elle a besoin d'un pointeur de fonction NULL pour ma tâche.

Donc, si je dois passer une autre fonction comme ce qui suit:

extern "C" int fkt() 
{ 
return NULL; 
} 

il aurait travaillé mais je besoin d'un pointeur de fonction NULL.

EDIT:

Eh bien cela fonctionne:

extern "C" int fkt() 
{ 
return NULL; 
} 
... 

function_from_lib(... , fkt); 

Cela ne fonctionnerait pas:

int fkt() 
{ 
return NULL; 
} 
... 

function_from_lib(... , fkt); 

Et maintenant je dois passer un NULL functionpointer

function_from_lib(... , (int (*)()) NULL); 

et ça ne marche pas travail t parce qu'il n'extern "C"

EDIT2 (MISE À JOUR ERREUR)

ERROR: 
argument of type "I32(*)()" is incompatible with parameter of type "I32(*)() C" 
+0

S'il vous plaît ajouter un exemple de code plus complet, ce que vous avez essayé et qui ne fonctionne pas – nishantjr

+1

IIRC, 'extern « C »' empêche seulement le nom de la fonction d'être mutilée (C++ est-ce que pour permettre par exemple surcharge de fonction). Cela n'aurait aucun impact sur un pointeur de fonction. Quelle est l'erreur réelle que vous obtenez? – Medo42

+0

Maintenant j'espère que c'est un peu plus clair ce que je veux dire. –

Répondre

2

Il pourrait être possible d'utiliser typedef: s. (Je n'ai pas accès à un compilateur qui se plaint de votre code, donc je ne peux pas le vérifier). Par exemple:

extern "C" 
{ 
    typedef int (*my_fp_type)(void); 
} 

function_from_lib(... , (my_fp_type)0);