Specifikace propojení
Pojem "Specifikace propojení" představuje protokol pro propojení funkcí (nebo procedur) napsaných v různých jazycích.Jsou ovlivněny následující konvence volání:
Rozlišování velikosti písmen názvů.
Dekorace názvů.V jazyce C, názvy přípon kompilátoru s podtržítkem.To se často nazývá "dekorace". V jazyce C++ umožňuje dekorace názvu zachovat informace o typu skrze fázi propojení. (Viz Dekorované názvy)
Pořadí, ve kterém jsou argumenty v zásobníku očekávány.
Odpovědnost za nastavení zásobníku při návratu z funkce.Zodpovědná je volaná funkce nebo funkce, která volání provádí.
Předávání skrytých argumentů (jsou-li nějaké skryté argumenty předány).
extern string-literal { declaration-list }
extern string-literal declaration
Specifikace propojení usnadňuje postupný přenos kódu z jazyka C do C++ povolením použití existujícího kódu.
Specifické pro Microsoft
Specifikace propojení aktuálně podporované Microsoft C++ jsou "C" a "C++".
Specificka produktu Microsoft END
Následující příklad deklaruje funkce atoi a atol pomocí propojení jazyka C:
extern "C"
{
int atoi( char *string );
long atol( char *string );
}
Volání těchto funkcí je uskutečněno pomocí propojení jazyka C.Stejného výsledku lze dosáhnout pomocí těchto dvou deklarací:
extern "C" int atoi( char *string );
extern "C" long atol( char *string );
Specifické pro Microsoft
Standardní soubory zahrnutí Microsoft C používají pro zjištění kompilaci jazyka C++ direktivy podmíněné kompilace.Je-li zjištěna kompilace jazyka C++, jsou prototypy uzavřeny v direktivě extern "C" takto:
// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
Specificka produktu Microsoft END
Není nutné deklarovat funkce ve standardních souborech zahrnutí, jako extern "C".
Pokud je funkce přetížena, nemůže mít specifikátor propojení více než jedna z funkcí se stejným názvem. (Další informace naleznete v tématu Přetížení funkce).
Následující tabulka ukazuje, jak pracují různé specifikace propojení.
Účinky specifikací propojení
specifikace |
Efekt |
---|---|
Na objekt |
Ovlivňují propojení pouze tohoto objektu |
Na funkci |
Ovlivňují propojení této funkce a všech dalších funkcí a objektů v ní deklarovaných |
Na třídu |
Ovlivňují propojení všech nečlenských funkcí a objektů deklarovaných v rámci třídy |
Pokud funkce obsahuje více specifikací propojení, musí tato propojení souhlasit. U deklarace funkcí, které mají propojení jazyka C i C++, se jedná o chybu.Navíc, pokud se v jednom programu vyskytují dvě deklarace funkce - jedna se specifikací propojení a jedna bez ni - musí být deklarace se specifikací propojení jako první.Jakékoli nadbytečné deklarace funkcí, které již specifikaci propojení obsahují, jsou zadanému propojení předány při první deklaraci.Příklad:
extern "C" int CFunc1();
...
int CFunc1(); // Redeclaration is benign; C linkage is
// retained.
int CFunc2();
...
extern "C" int CFunc2(); // Error: not the first declaration of
// CFunc2; cannot contain linkage
// specifier.
Funkce a objekty explicitně deklarované jako static, jsou v těle složeného specifikátoru propojení ({ }) považovány za statické funkce nebo objekty. Specifikátor propojení je ignorován.Ostatní funkce a objekty se chovají, jako kdyby byli deklarováni pomocí klíčového slova extern. (Podrobnosti o klíčovém slově extern naleznete v tématu Použití klíčového slova extern k určení propojení.)