Specyfikacje połączenia
Termin "specyfikacja powiązania" odnosi się do protokołu dla łączenia funkcji (lub procedur), napisanych w różnych językach.Dotyczy to następujących konwencji wywoływania:
Wielkość liter w nazwach.
Dekoracja nazw.W C, kompilator prefiksuje nazw za pomocą podkreślenia.Jest to często nazywane "dekoracją." W języku C++ dekoracja nazw służy do przechowywania informacji o typie w fazie powiązania. (Zobacz Nazwy dekorowane)
Kolejność, w której argumenty oczekują na stosie.
Odpowiedzialności za dostosowanie stosu podczas wyjścia z funkcji.Funkcja wywoływana lub funkcja wywołująca jest odpowiedzialna.
Przekazywanie ukrytych argumentów (czy wszelkie ukryte argumenty są przekazywane).
extern string-literal { declaration-list }
extern string-literal declaration
Specyfikacja powiązania ułatwia stopniowe eksportowanie kodu języka C do kodu C++, pozwalając na użycie istniejącego kodu.
Specyficzne dla firmy Microsoft
Jedyne aktualnie obsługiwane przez Microsoft C++ specyfikacje powiązania to "C" i "C++".
KONIEC informacji specyficznych dla firmy Microsoft
W poniższym przykładzie zadeklarowano funkcje atoi i atol z powiązaniem C:
extern "C"
{
int atoi( char *string );
long atol( char *string );
}
Wywołania tych funkcji są wykonywane przy użyciu powiązania C.Taki sam efekt można osiągnąć za pomocą tych dwóch deklaracji:
extern "C" int atoi( char *string );
extern "C" long atol( char *string );
Specyficzne dla firmy Microsoft
Wszystkie standardowe pliki załączane Microsoft C używają dyrektyw kompilacji warunkowej do wykrywania kompilacji C++.Po wykryciu kompilacji C++, prototypy są ujęte w dyrektywach extern "C" w następujący sposób:
// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
KONIEC informacji specyficznych dla firmy Microsoft
Nie trzeba deklarować funkcji w standardowych plikach dołączanych jako extern "C".
Jeżeli funkcja jest przeciążona, nie więcej niż jedna z funkcji o tej samej nazwie może mieć specyfikator powiązania. (Aby uzyskać więcej informacji, zobacz Przeciążanie funkcji.)
W poniższej tabeli pokazano, jak różne specyfikacje powiązania działają.
Efekty specyfikacji powiązania
Specyfikacja |
Efekt |
---|---|
Na obiekt |
Dotyczy powiązania tylko tego obiektu |
Na funkcję |
Dotyczy powiązania tej funkcji i wszystkich funkcji lub obiektów w niej zadeklarowanych |
Na klasę |
Dotyczy powiązania wszystkich funkcji nie członkowskich i obiektów zadeklarowanych w obrębie tej klasy |
Jeśli funkcja ma więcej niż jedną specyfikację powiązania, muszą być zgodne; błędem jest deklaracja funkcji jako posiadających powiązania C i C++.Ponadto jeśli dwie deklaracje dla funkcji występują w programie — jedna ze specyfikacją powiązania i jedna bez niego — deklaracja ze specyfikacją powiązania musi być pierwsza.Wszystkim nadmiarowym deklaracjom funkcji, które mają już specyfikację nadawane są specyfikacje powiązania określone w pierwszej deklaracji.Na przykład:
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.
Funkcje i obiekty jawnie zadeklarowane jako static w ramach ciała złożonego specyfikatora powiązania ({ }) są traktowane jako statyczne funkcje lub obiekty; specyfikator powiązania jest ignorowany.Inne funkcje i obiekty zachowują się tak, jakby były zadeklarowane za pomocą słowa kluczowego extern. (Zobacz Korzystanie z extern do specyfikacji powiązania, aby uzyskać szczegółowe informacje dotyczące słowa kluczowego extern.)