Compte tenu du code C ++ suivant, est-il possible d'appeler getnum () code> de C? p> P>
4 Réponses :
Non, puisque Une solution possible à ce problème consiste à écrire une fonction C ++ pour renvoyer une instance getnum code> est une fonction de membre qui n'a pas. p>
FOO code> en tant que
foo * code> (où
foo code> est modifié être une structure vide) à c (je suppose que cela est compilé binaire comme C ++ à laquelle c est reliant), a ensuite une fonction libre dans C ++ appelée
foo_getnum code> ou quelque chose qui prend un
foo * code> (dont la définition est modifiée pour la version C à vide) qui appelle
getnum code> dessus. Cela ne serait pas de type sécuritaire, évidemment, (mais prenant un
foo * code> même lorsque
foo code> est vide serait mieux que
vide * code> - merci David). P>
Pourquoi Typedeft struct {} FOO code> meilleur que
Typef video FOO code> dans ce cas?
Les états standard langage C ++ (C ++ 03 §7.5 / 4): p>
Un lien de langage C est ignoré pour les noms des membres de la classe et la fonction de membre
type de fonctions membres de la classe. p>
blockQuote>
Alors, non, vous ne pouvez pas appeler cette fonction directement à partir d'un programme C (bien que, comme d'autres l'ont dit, vous ne pouvez pas compiler ce code comme C de toute façon parce que C n'a pas de fonctions membres). Il est bien entendu concevable que certaines implémentations pourraient vous permettre d'appeler cette fonction à partir d'un programme C via une méthode spécifique à l'implémentation. P> extern "C" code> n'a pas d'effet sur la fonction membre:.
getNum () code> a la liaison langage C de p>
L'intention est de compiler avec C ++ à être liée par un programme C.
Vous ne pouvez pas appeler cette fonction membre de C de manière portable. Vous devez exposer votre interface C ++ en l'aplatissant. P>
Est-ce que aplatissait i> ce que j'ai décrit dans ma réponse? Je n'ai pas entendu ce terme auparavant (il y a beaucoup de termes que je n'ai pas entendu auparavant).
@Skiwi Oui, vous décrivez ce que je sais que l'aplatissement. Soit dit en passant, void * code> est peut-être pas la meilleure approche. Vous pouvez obtenir une sécurité de type en déclarant un struct vide et fonctionnant avec des pointeurs vers qui struct.
Je vous crois, y a-t-il un article que je peux lire expliquer pourquoi ce dernier est plus sûr, alors je n'ai pas à perdre votre temps à vous faire expliquer?
@Seth quelque part sans doute il y a. J'étais éduqué ici de manière à ce que je ne me souvienne pas de qui, l'un des gourous Uber C ++. Il n'y a pas grand chose à ça. Dans C VOID * CODE> EST Compatible avec tous les types de pointeur, sans coulée. Donc, pour obtenir une certaine sécurité, la sécurité, votre type de pointeur doit pointer sur un type de structure vide. Ensuite, vous ne pouvez pas envoyer des chaînes C à une fonction C ++ attend un objet !!
Le code que vous avez donné ne compile pas en mode C sous forme de C compilateur C ne prend pas en charge les fonctions de la structure. Cependant, vous pouvez créer une fonction en C ++ pouvant appeler cela et le lier avec C liaison C. Créez 2 fichiers MAIN.C et ABC.CPP
CODE POUR MAIN.C P>
calling getNum
Ceci est presque utile mais GetNumCaller doit être passé un pointeur à la structure. Cela aplatit l'interface.
@David Que voulez-vous dire en aplatissant l'interface? N'ont jamais entendu parler de ce terme
Ce ne sera pas compilé en C.
@Bertrand op veut la compiler en C ++, mais l'appelez de C.
@Bertrand: L'intention est d'appeler la fonction à partir du code C.
Oh, cependant, j'ai mal interprété la chose.
Comment l'appelleriez-vous de c?
@Martin: Voir ici - DSC.sun.com/solaris/articles/Mixing. html # cpp_from_c
@Code: Donc, de C vous appelez une fonction C ++ qui arrive à avoir la liaison C. Ensuite, la fonction C de peut appeler les méthodes sur un objet.