[ 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?
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.