Men, hvordan kaller man C++ kode fra C. Det er vel både calling
conventions og annen moro inne i bildet her.
Bruer MS Embedded Visual C++ 4.0 sp 4.
Glenn
Det blir vel omtrent det samme andre veien. Hvis du putter dette :
extern "C" int f();
int f()
{
...
}
i en C++-fil, så skal det gå an å putte dette :
int f();
int main()
{
return f();
}
i en C-fil.
Visse begrensninger gjelder selvfølgelig ettersom C ikke støtter overloading
osv.
--
Sigurd
http://utvikling.com
Flere måter det kan gjøres på.
(1) Bruk en binær standard som for eksempel COM. Brukt i for eksempel
Mozilla.
(2) Eksporter 'extern "C"' funksjoner fra C++, anrop dem fra C.
(3) Bruk et mellomledd laget i et eller annet språk (som kan være
C, C++ eller forsåvidt Python).
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
Dette blir kompilert som C kode, ikke sant? hvilket betyr at en funksjon
feks ikke kan være en wrapper for en klasse (dvs bruke en klasse som
blir instansiert i C++ funksjonenen).
>
> (3) Bruk et mellomledd laget i et eller annet språk (som kan være
> C, C++ eller forsåvidt Python).
Hvis du skal lage et mellomledd i C++ for å kalle C++, så kan vel dette
gjøres direkte. Hva mener du egentlig?
Glenn
Nei, det blir kompilert som C++, og du kan (selvfølgelig) bruke C++ i
funksjonen. Ellers hadde det vel vært lite vits ? Det eneste som blir "C"
er funksjonens "signatur" - dette er rett og slett en grei måte å styre
funksjonens navn på (i objekt-fil-format).
Det er heller ikke noe i veien for å kalle en vanlig funksjon skrevet i C++
fra kode skrevet i C - det er bare veldig komplisert å holde rede på navnet
etterhvert som parametre endres, samtidig som koden knapt kan påstås å bli
særlig portabel. Funksjoner skrevet i C++ får "mangled names" i
objektfilene, slik at funksjonens navn på dette nivået altså inneholder
informasjon om hvilke parametre funksjonen tar. Det er derfor det går an å
ha flere funksjoner med samme navn i C++.
--
Sigurd
http://utvikling.com
Nei, en slik funksjon blir kompilert som C++, men har C linking (som
betyr at funksjonen ikke kan eller helst ikke bør være overlesset).
Siden standarden er ganske taus om anropskonvensjoner kan det i tillegg,
avhengig av kompilatoren, være nødvendig å spesifisere anropskonvensjonen.
Det må da eventuelt gjøres med en eller annen ustandard språkutvidelse
som for eksempel Microsofts '__cdecl'.
> hvilket [i så fall] betyr at en funksjon
> feks ikke kan være en wrapper for en klasse (dvs bruke en klasse som
> blir instansiert i C++ funksjonenen).
>
> >
> > (3) Bruk et mellomledd laget i et eller annet språk (som kan være
> > C, C++ eller forsåvidt Python).
>
> Hvis du skal lage et mellomledd i C++ for å kalle C++, så kan vel dette
> gjøres direkte. Hva mener du egentlig?
Det kan ikke nødvendigvis gjøres direkte. C++ er ikke nødvendigvis C++...
For å være konkret, to forskjellige C++ kompilatorer kan være inkompatible
på maskinkodenivået, men en av dem, Stugga, kan gi deg bedre styring enn den
andre og dermed tillate deg å koble kode kompilert med C-kompilator Ugga
sammen med kode kompilert med C++-kompilator Bugga, sånn for eksempel.
På et mer abstrakt nivå, hvis A og B ikke skjønner hverandres (maskin-) språk
så kan de likevel kommunisere hvis du plasserer en oversetter O i mellom dem.
Men, sier du, A og B er jo begge C++? De kommer begge fra planeten Jorden?
Likevel kan de ha dette lille kommunikasjonsproblemet.