Sdílet prostřednictvím


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í.)

Viz také

Referenční dokumentace

Používání příkazu extern pro specifikaci propojení