Prev Next Up Title Contents Index

C++ funktioiden kutsuminen C- kielestä

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 - C++ funktiota kutsuva C-ohjelma

	/* PISTE.C */
	#include "piste2ali.h"
	
	int main(void)
	{
	  tPiste p={4,5};
	  tulosta(&p);
	  return 0;
	}

piste2ali.h - C:stä kutsuttava C++ prototyyppi

	/* PISTE2ALI.H */
	typedef struct {
	  int x,y;
	} tPiste;
	
	#ifdef __cplusplus
	extern "C"
	#endif
	  void tulosta(const tPiste *p);

piste2ali.cpp - C:stä kutsuttava C++ funktio

	 /* 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):

piste3ali.cpp - C:stä kutsuttava C++ funktio

	extern "C" void tulosta(const tPiste *p)
	{
	  cPiste ap(p); // Luokkassa cPiste esitelty konstruktori cPiste(tPiste *)
	  ap.tulosta();
	}


Prev Next Up Title Contents Index