Lingue di collegamento C ++ diverse da C?


25

Il linguaggio C ++ consente il mixaggio di C ++ e C in un unico file sorgente. Per esempio,

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

C ++ o ha mai supportato altri "linguaggi di collegamento" diversi da C? es. extern "Pascal"oextern "Haskell"


il più delle volte entrambe le lingue faranno il loro extern "C"equivalente per interagire tra loro
maniaco del cricchetto

Il C ++ supporta altri collegamenti consentendo alle implementazioni di aggiungere i loro tipi di collegamenti (§7.5), la domanda dovrebbe essere "Esistono implementazioni o esistono implementazioni" ;-)
johannes

2
extern "C"influisce solo sul collegamento, non sulla sintassi e sulla semantica del testo all'interno del blocco. In altre parole, è ancora C ++ all'interno di quel extern "C"blocco; i nomi dei simboli non sono alterati. Vedi stackoverflow.com/q/1041866/712605
Richard Hansen il

Risposte:


17

extern "C" potrebbe essere l'unico richiesto:

Ogni implementazione prevede il collegamento a funzioni scritte nel linguaggio di programmazione C, "C" e il collegamento a funzioni C ++, "C ++".

Tuttavia, altri possono esistere secondo questa citazione:

Il valore letterale stringa indica il collegamento linguistico richiesto. Questo standard internazionale specifica la semantica per i letterali di stringa "C" e "C ++". L'uso di una stringa letterale diversa da "C" o "C ++" è supportato in modo condizionale, con semantica definita dall'implementazione. [Nota: pertanto, una specifica di collegamento con un valore letterale stringa sconosciuto all'implementazione richiede una diagnostica. - end note] [Nota: si raccomanda che l'ortografia del letterale stringa sia presa dal documento che definisce quella lingua. Ad esempio, Ada (non ADA) e Fortran o FORTRAN, a seconda della vendemmia. - nota finale]


1
Da dove viene citato questo?
paul

@paul c ++ 11 bozza standard
aaronman,

9

In molti (molti) ambienti "extern" C "è la convenzione di collegamento predefinita per qualsiasi lingua del sistema.

Quindi, a seconda del sistema operativo e dell'implementazione della lingua "straniera" "extern C" è tutto ciò che serve per chiamare un programma in un'altra lingua compilata.


Perfino gli ambienti che non usano il collegamento C (Pascal, ad esempio, spesso usano un altro ordine di argomenti in pila e la chiamata deve liberare il valore) hanno una modalità C-compatibile
johannes

@johannes: In realtà Windows usa la convenzione Pascal per molte cose, ma poiché ha bisogno che anche in C e C non abbia la " extern "Language"" sintassi, lo fanno tramite l'estensione C specifica della piattaforma, quindi per C ++ è ancora giusto extern "C"e la speciale la parola chiave specifica la diversa convenzione di chiamata.
Jan Hudec,

1
Potrebbero esserci comunque casi in cui un fornitore di compilatori aggiunge tipi di collegamento speciali. Oltre all'interoperabilità con altre lingue, questo potrebbe essere interessante anche per l'interoperabilità con diverse manipolazioni di nomi C ++. La domanda è se qualcuno l'ha fatto :)
johannes il


-4
  • No! C ++ supporta C solo come "lingue di collegamento".

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

  • La sintassi come sopra significa che non cambia il nome di variabile, struttura o funzione. Perché C ++ può cambiare il nome di variabile, struttura o funzione per implementare il sovraccarico di classe, spazio dei nomi e funzione.

  • Se non lo fai, il linker potrebbe non riuscire a scoprire l'oggetto della variabile, struttura della funzione.

  • C ++ è progettato per essere compatibile con C. L'esterno "C" è il modo di implementare compatibile con C.


10
Si prega di controllare §7.5 dello standard C ++. extern "C"e extern "C++"sono gli unici obbligatori, ma le implementazioni sono autorizzate a fornire altri.
johannes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.