Udostępnij za pośrednictwem


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

Zobacz też

Informacje

Użycie zewnętrznie w celu określenia powiązania