C ++ Linkage ¿Idiomas distintos de C?

25

El lenguaje C ++ permite la mezcla de C ++ y C en un archivo fuente. Por ejemplo,

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

¿C ++ o alguna vez ha admitido otros "lenguajes de enlace" que no sean C? por ejemplo extern "Pascal"oextern "Haskell"

dkaranovich
fuente
la mayoría de las veces, ambos idiomas harán su extern "C"equivalente para interactuar entre sí
Ratchet freak
C ++ admite otros enlaces al permitir que las implementaciones agreguen sus tipos de enlaces (§7.5), la pregunta debería ser "¿Existen implementaciones o existen implementaciones" ;-)
johannes
2
extern "C"solo afecta la vinculación, no la sintaxis y la semántica del texto dentro del bloque. En otras palabras, sigue siendo C ++ dentro de ese extern "C"bloque; los nombres de los símbolos simplemente no están destrozados. Ver stackoverflow.com/q/1041866/712605
Richard Hansen el

Respuestas:

17

extern "C" puede ser el único requerido:

Toda implementación proporcionará enlaces a funciones escritas en el lenguaje de programación C, "C", y enlaces a funciones C ++, "C ++".

Sin embargo, pueden existir otros según esta cita:

El literal de cadena indica el enlace de idioma requerido. Esta Norma Internacional especifica la semántica para los literales de cadena "C" y "C ++". El uso de un literal de cadena que no sea "C" o "C ++" se admite condicionalmente, con una semántica definida por la implementación. [Nota: por lo tanto, una especificación de vinculación con un literal de cadena desconocido para la implementación requiere un diagnóstico. - nota final] [Nota: se recomienda que la ortografía del literal de cadena se tome del documento que define ese idioma. Por ejemplo, Ada (no ADA) y Fortran o FORTRAN, dependiendo de la cosecha. - nota final]

aaronman
fuente
1
¿De dónde se cita esto?
Paul
@paul c ++ 11 draft estándar
aaronman
9

En muchos (la mayoría) de los entornos, "extern" C "es la convención de enlace predeterminada para cualquier lenguaje en el sistema.

Por lo tanto, dependiendo del sistema operativo y la implementación del lenguaje "extranjero" "externo C" es todo lo que necesita para llamar a un programa en otro lenguaje compilado.

James Anderson
fuente
Incluso los entornos que no utilizan el enlace C (Pascal, es decir, a menudo usa otro orden de argumentos en la pila y el destinatario tiene que liberar el valor) tienen un modo compatible con C
johannes
@johannes: en realidad, Windows usa la convención de Pascal para muchas cosas, pero dado que también necesita eso en C y C no tiene la extern "Language"sintaxis " ", lo hacen a través de la extensión C específica de la plataforma, por lo que para C ++ sigue siendo justo extern "C"y especial La palabra clave especifica la convención de llamada diferente.
Jan Hudec
1
Aún así, puede haber casos en los que un proveedor de compiladores agregue tipos de enlaces especiales. Además de la interoperabilidad con otros lenguajes, esto también podría ser interesante para la interoperabilidad con diferentes nombres de C ++. La pregunta es si alguien lo hizo :)
johannes
-4
  • ¡No! C ++ solo admite C como "lenguajes de enlace".

  • "C" externa {barra de estructura {/ * ... * /}}

  • La sintaxis como arriba significa que no cambia el nombre de la variable, estructura o función. Debido a que C ++ puede cambiar el nombre de la variable, estructura o función para implementar la Clase, el Espacio de nombres y la sobrecarga de funciones.

  • Si no hace esto, el enlazador tal vez no pueda encontrar el objeto de la variable, la estructura de la función.

  • C ++ está diseñado para ser compatible con C. La "C" externa es la forma de implementar compatible con C.

Edward Shen
fuente
10
Verifique §7.5 del estándar C ++. extern "C"y extern "C++"son los únicos obligatorios, pero las implementaciones pueden proporcionar otros.
johannes