8
votes

extern C et un procédé struct

Compte tenu du code C ++ suivant, xxx

est-il possible d'appeler getnum () de C?


7 commentaires

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.


4 Réponses :


7
votes

Non, puisque getnum est une fonction de membre qui n'a pas.

Une solution possible à ce problème consiste à écrire une fonction C ++ pour renvoyer une instance FOO en tant que foo * (où foo 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 ou quelque chose qui prend un foo * (dont la définition est modifiée pour la version C à vide) qui appelle getnum dessus. Cela ne serait pas de type sécuritaire, évidemment, (mais prenant un foo * même lorsque foo est vide serait mieux que vide * - merci David).


1 commentaires

Pourquoi Typedeft struct {} FOO meilleur que Typef video FOO dans ce cas?



7
votes

extern "C" n'a pas d'effet sur la fonction membre:. getNum () a la liaison langage C de

Les états standard langage C ++ (C ++ 03 §7.5 / 4):

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.

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.


1 commentaires

L'intention est de compiler avec C ++ à être liée par un programme C.



3
votes

Vous ne pouvez pas appeler cette fonction membre de C de manière portable. Vous devez exposer votre interface C ++ en l'aplatissant.


5 commentaires

Est-ce que aplatissait 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 * 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 * 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 !!


@Seth Lire ici: développeurs.sun.com/solaris/articles/mixing.html et faire défiler jusqu'à la section intitulée Accès aux classes C ++ de C . Vous pouvez utiliser des définitions de struct incomplètes qui sont bien.



1
votes

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


2 commentaires

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