Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Kalle C++ kode fra C

2 views
Skip to first unread message

Glenn Ivar Klausen

unread,
Apr 4, 2005, 10:35:53 AM4/4/05
to
For å kalle C kode fra C++ bruker man som mange sikker kjenner til
extern "C" void function(void)

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

Sigurd Stenersen

unread,
Apr 4, 2005, 10:46:25 AM4/4/05
to

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


Alf P. Steinbach

unread,
Apr 4, 2005, 10:58:30 AM4/4/05
to
* Glenn Ivar Klausen:

>
> hvordan kaller man C++ kode fra C.

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?

Glenn Ivar Klausen

unread,
Apr 4, 2005, 11:47:27 AM4/4/05
to
Alf P. Steinbach wrote:
> * Glenn Ivar Klausen:
>
>>hvordan kaller man C++ kode fra C.
>
>
> Flere måter det kan gjøres på.
>
> (2) Eksporter 'extern "C"' funksjoner fra C++, anrop dem fra C.

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

Sigurd Stenersen

unread,
Apr 4, 2005, 11:59:20 AM4/4/05
to
Glenn Ivar Klausen wrote:
> Alf P. Steinbach wrote:
>> * Glenn Ivar Klausen:
>>
>>> hvordan kaller man C++ kode fra C.
>>
>> (2) Eksporter 'extern "C"' funksjoner fra C++, anrop dem fra C.
>
> 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).

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


Alf P. Steinbach

unread,
Apr 4, 2005, 12:15:52 PM4/4/05
to
* Glenn Ivar Klausen:

> Alf P. Steinbach wrote:
> > * Glenn Ivar Klausen:
> >
> >>hvordan kaller man C++ kode fra C.
> >
> >
> > Flere måter det kan gjøres på.
> >
> > (2) Eksporter 'extern "C"' funksjoner fra C++, anrop dem fra C.
>
> Dette blir kompilert som C kode, ikke sant?

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.

0 new messages