Jos on valmiina C++ funktioita, joiden kutsut on periaatteessa mahdollista muuttaa C- funktioiksi, pitää rakentaa väliin C++:lla funktio joka on tyyppiä "C". Muuttaminen on mahdollista, mikäli funktion parametrilistassa olevat tyypit ovat myös C- tyyppejä tai sellaisiksi muunnettavissa. Usein myös C++ luokat voidaan muuttaa C- tietueiksi, koska itse luokan alkiot ovat samanlaisia kuin C- tietueen alkiot.
/* PISTE.C */ #include "piste2ali.h" int main(void) { tPiste p={4,5}; tulosta(&p); return 0; }
/* PISTE2ALI.H */ typedef struct { int x,y; } tPiste; #ifdef __cplusplus extern "C" #endif void tulosta(const tPiste *p);
/* PISTE2ALI.CPP */ #include <stdio.h> #include "piste2ali.h" class cPiste { int x,y; public: void tulosta() const; }; void cPiste::tulosta() const { printf("(%d,%d)\n",x,y); } extern "C" void tulosta(const tPiste *p) { ((cPiste *)p)->tulosta(); }
Huomautus! Esimerkki toimii vain jos C++ tietueessa (luokassa) ei ole yhtään virtuaalista funktiota! Jos luokassa on virtuaalisia funktioita, pitää tehdä osoittimen tyypinmuunnoksen (cPiste *) sijasta rehellinen sijoitus C++ tyyppiseen apumuuttujaan (ks. Olio- osoittimet):
extern "C" void tulosta(const tPiste *p) { cPiste ap(p); // Luokkassa cPiste esitelty konstruktori cPiste(tPiste *) ap.tulosta(); }