[ ljube @ 03.09.2004. 10:01 ] @
Imam neke programe pisane u C-u.
Nedavno sam preradio kompletnu aplikaciju da se kompajlira sa MS C++
Sada imam neki miks CPP fajlova i starih C funkcija.

Negdje sam procitao da C fajlovi moraju da imaju:

extern "C" {
...
...
c kod
...
...
}


Za sada progam radi bez ikakvih vidljivih problema, ali me zanima da li treba da se stavi extern "C" na pocetku C fajlova?

Pozdrav,
Ljubisa
[ Ivan Dimkovic @ 03.09.2004. 10:17 ] @
Extern "C" se stavlja u C++ fajlove, ili u deklaraciji funkcija kako bi se izbegli problemi pri linkovanju sa C fajlovima - naime kod C++ funkcija kompajler ih zavodi kao "mangled names" .

Recimo - u C++

int MojaFunkcija(float a, float b) se belezi i referencira (u razresavanju simbola) kao:

MojaFunkcija@@YAHMM@Z

Ovo govori kompajleru i linkeru o kojim se prosledjenim parametrima radi (vrlo bitno ako recimo klasa ima vise implementacija iste funkcije koje se razlikuju samo po prosledjenim parametrima)

Tako da ako hoces da kombinujes C kod sa C++ kodom, C++ kompajleru moras dati do znanja da je odredjena funkcija C tipa - kako ne bi dobio nerazresene simbole jer C deo koda ne razume "mangled names"
[ caboom @ 03.09.2004. 10:22 ] @
nazalost name mangling u c++ bibliotekama je neizbezan :(. koliko mi je poznato ne postoji ni neka standardizacija u name mangling-u, osim neke koje je sun svojevremeno pokusao da nametne. da li neko zna nesto vise o tome (potencijalnoj standardizaciji po pitanju name mangling-a u bibliotekama)?
[ zvrba @ 03.09.2004. 10:42 ] @
Dovoljno je samo DEKLARACIJE u .h fajlovima staviti unutar extern "C". Obicno ide ovako:

#ifdef __cplusplus
extern "C" {
#endif

int mojafunkcija1(int, float);
/* jos tvojih funkcija */

#ifdef __cplusplus
}
#endif
[ ljube @ 03.09.2004. 10:56 ] @
OK,

Hvala Vam svima.

Pozdrav,
Ljubisa
[ leka @ 03.09.2004. 17:50 ] @
Ako Bog da svi ce usvojiti vec siroko rasprostranjen CodeSourcery-jev C++ ABI, tako da ce to sve biti lepo standardizovano (konacno). Jednom mesecno posetim sajt u vezi C++ ABI-ja i vidim da su iza tog projekta Intel, Amd, Sun, cini mi se i IBM i SGI - ne secam se. Sve u svemu treba pogledati. To ce garant biti u buducnosti obavezan uslov koji svaki proizvodjac C++ kompajlera mora da ispostuje.
[ Dragi Tata @ 03.09.2004. 18:39 ] @
Od toga naravno nema ništa. Koji će proizvođač da promeni mangling šemu i time prekine kompatibilnost između dve verzije svog kompajlera?