[ duke @ 02.08.2001. 01:25 ] @
Zna li neko kako da povezem C i C++ module, pri cemu main() treba da se nalazi u C modulu? Dakle, nije problem kako napisati C f-ju koja se moze pozvati iz C++ (extern "C"), vec obrnuto, kako da iz C f-je pozovem neku koja je C++.

Pretpostavljam da je to moguce uraditi tako sto iz .o fajla izvucem 'pravo' ime C++ f-je, pa onda to ime koristim za poziv, ali vise bi mi odgovaralo neko cistije resenje.

Naravno, koristim gcc (3.0), ali bi mi dobro dosao i odgovor vezan za druge kompajlere i operativne sisteme (da im bas ne spominjem imena, znate sigurno na koga mislim)
[ Vojislav Milunovic @ 02.08.2001. 10:22 ] @
A sto ne kompajliras oba programa sa g++ (C++ kompajlerom pa ih onda ulinkujes??? )
[ tOwk @ 03.08.2001. 04:18 ] @
pa funkciju koju pises u C++ definisi kao extern "C", i onda nju pozivas bez problema iz C-a. Ukoliko treba napravis je samo kao interfejs izmedju C-a i prave funkcije, npr:
Code:
extern "C" mojafunc(int p) {
   mojafunc_cpp(int p);
}

Kompajliras svaki od ovih u objektne module (znaci sa gcc koristis -c, npr. "gcc -c -o mojcpp.o mojprog.cpp" i "gcc -c -o mojc.o mojprog.c" i na kraju ih linkujes sa ld, ekvivalentno za druge kompajlere).

Tako bi to trebalo da radi, medjutim nisam mnogo isprobavao, pa me ne drzi za rec.

Toliko.
[ tOwk @ 03.08.2001. 04:21 ] @
Moram da dodam jos nesto.

Koje ce ime biti u objektnom fajlu zavisi od kompajlera, i najverovatnije ce biti isto kao i ono koje si definisao (npr. mojafunkcija_cpp), ili mozda sa crticom ispred (_mojafunkcija_cpp). Problem moze jedino nastati u tome kako se prosledjuju parametri, a posto C++ nisam mnogo koristio ne znam da li je isto kao i za C. Ako je isto, onda ne bi trebao da imas ikakvih problema pri obicnom pozivanju funkcije (onda nema razlike u deklaraciji, pa prema tome ne bi imalo smisla postojanje 'extern "C"'...).

Toliko.
[ duke @ 03.08.2001. 07:31 ] @
Citat:

Tako bi to trebalo da radi, medjutim nisam mnogo isprobavao, pa me ne drzi za rec.


Ja jesam isprobavao nesto jako slicno ovome sto si ti napisao (trenutno nisam u stanju da proverim, ali to je to) i naravno nije radilo. Medjutim, ono sto je predator napisao je pravo resenje!

Inace, sto se tice imena koja kompajleri daju c++ funkcijama .... Nije to da bas samo dodaju _ ispred imena, dodaju i tipove parametara i ime klase i svasta ...

Jos jednom, hvala predatoru, ne mogu jos da proverim da li ce to raditi, ali ne vidim zasto ne bi?
[ tOwk @ 03.08.2001. 22:53 ] @
Parametri ne ulaze u sastav objektnih fajlova, kao ni tip funkcije ni nista.

Svaka funkcija vraca int (standardni tip na platformi na kojoj se radi), a on se razlicito interpretira u zavisnosti od potrebe, kao pointer ukoliko se radi o strukturama, nizovima, pointerima, kao sam int za cele brojeve, a najverovatnije i kao pointer za floating point brojeve ukoliko ne mogu da stanu u int. Prema tome, to i nema potrebe beleziti u objektni fajl, a i jasno je da je tako, jer nam ne bi onda uz silne biblioteke bili potrebni i header (.h) fajlovi, vec bi se sve citalo iz objektnih fajlova.

Sto se tice klasa i objekata, to isto spada u opis funkcije. Tacno je, naravno, da se ime tada generise na razne nacine i to zavisi od kompajlera do kompajlera, ali ono sto je bitno nije nacin definisanja imena, vec nacin prenosenja parametara. C++ standard nije bio definisan do nedavno ja mislim, pa je svaka implementacija C++ kompajlera mogla na svoj nacin da izvede prenosenje parametara.

Prema tome, od kompajlera zavisi kakvo ce ime imati funkcija u objektnom fajlu, kao i kako ce se prenositi parametri. Zato se i ne mogu mesati GCC C++ kompajler i Borland C kompajler, ili obrnuto.

Jedino ne razumem zasto ne bi onako sve radilo, ali naravno, jedno resenje moze biti sve kompajlirati sa C++ kompajlerom.

Toliko.