Langages de liaison C ++ autres que C?

25

Le langage C ++ permet le mélange de C ++ et C dans un fichier source. Par exemple,

extern "C" {
    struct bar { /* ... */ }
}

Est-ce que C ++ ou a-t-il déjà pris en charge d'autres "langages de liaison" autres que C? par exemple extern "Pascal"ouextern "Haskell"

dkaranovich
la source
la plupart du temps, les deux langues feront leur extern "C"équivalent pour interagir
ratchet freak
C ++ prend en charge d'autres liens en permettant aux imlementations d'ajouter leurs types de liens (§7.5), la question devrait être "Les implémentations existent-elles ou ont-elles existé?" ;-)
johannes
2
extern "C"affecte uniquement le lien, pas la syntaxe et la sémantique du texte à l'intérieur du bloc. En d'autres termes, c'est toujours du C ++ à l'intérieur de ce extern "C"bloc; les noms des symboles ne sont tout simplement pas mutilés. Voir stackoverflow.com/q/1041866/712605
Richard Hansen

Réponses:

17

extern "C" peut être le seul requis:

Chaque implémentation doit prévoir une liaison avec des fonctions écrites dans le langage de programmation C, "C", et une liaison avec des fonctions C ++, "C ++".

Cependant, d'autres peuvent exister selon cette citation:

Le littéral de chaîne indique le lien de langue requis. La présente Norme internationale spécifie la sémantique des littéraux de chaîne "C" et "C ++". L'utilisation d'un littéral de chaîne autre que "C" ou "C ++" est conditionnellement pris en charge, avec une sémantique définie par l'implémentation. [Remarque: Par conséquent, une spécification de liaison avec un littéral de chaîne inconnu de l'implémentation nécessite un diagnostic. - note de fin] [Remarque: Il est recommandé que l'orthographe du littéral de chaîne soit tirée du document définissant cette langue. Par exemple, Ada (pas ADA) et Fortran ou FORTRAN, selon le millésime. - note de fin]

aaronman
la source
1
D'où cela est-il cité?
paul
@paul c ++ 11 standard draft
aaronman
9

Dans de nombreux (la plupart) des environnements, "extern" C "est la convention de liaison par défaut pour n'importe quelle langue du système.

Ainsi, selon le système d'exploitation et l'implémentation de la langue "étrangère" "extern C" est tout ce dont vous avez besoin pour appeler un programme dans une autre langue compilée.

James Anderson
la source
Même les environnements n'utilisant pas la liaison C (Pascal ie utilise souvent un autre ordre d'argument sur la pile et l'appelé doit libérer la valeur), ils ont un mode compatible C
johannes
@johannes: En fait, Windows utilise la convention Pascal pour beaucoup de choses, mais comme il en a besoin en C aussi et que C n'a pas la extern "Language"syntaxe " ", ils le font via l'extension C spécifique à la plate-forme, donc pour C ++ c'est toujours juste extern "C"et le spécial Le mot-clé spécifie les différentes conventions d'appel.
Jan Hudec
1
Dans certains cas, un fournisseur de compilateur peut encore ajouter des types de liaison spéciaux. Outre l'interopérabilité avec d'autres langages, cela pourrait également être intéressant pour l'interopérabilité avec différents changements de nom C ++. La question est de savoir si quelqu'un l'a fait :)
johannes
-4
  • Non! C ++ ne prend en charge que C en tant que «langages de liaison».

  • extern "C" {struct bar {/ * ... * /}}

  • La syntaxe comme ci-dessus signifie que ne change pas le nom de la variable, de la structure ou de la fonction. Parce que C ++ peut changer le nom de la variable, de la structure ou de la fonction pour implémenter la surcharge de classe, d'espace de nom et de fonction.

  • Si vous ne le faites pas, l'éditeur de liens peut ne pas trouver l'objet de la variable, la structure de la fonction.

  • C ++ est conçu pour être compatible avec C. Le "C" externe est le moyen d'implémenter compatible avec C.

Edward Shen
la source
10
Veuillez vérifier le §7.5 de la norme C ++. extern "C"et extern "C++"sont les seuls obligatoires, mais les implémentations sont autorisées à en fournir d'autres.
johannes