extern (C++)

Słowo extern kluczowe może być stosowane do zmiennej globalnej, funkcji lub deklaracji szablonu. Określa, że symbol ma externpołączenie al. Aby uzyskać podstawowe informacje na temat łączenia i dlaczego korzystanie ze zmiennych globalnych jest odradzane, zobacz Jednostki tłumaczenia i powiązania.

Słowo extern kluczowe ma cztery znaczenia w zależności od kontekstu:

  • W deklaracji zmiennej innejconst niż globalna określa, extern że zmienna lub funkcja jest zdefiniowana w innej jednostce tłumaczenia. Element extern musi być stosowany we wszystkich plikach, z wyjątkiem tego, w którym zdefiniowano zmienną.

  • W deklaracji zmiennej const określa, że zmienna ma externpołączenie al. Element extern należy zastosować do wszystkich deklaracji we wszystkich plikach. (Zmienne globalne const domyślnie mają powiązania wewnętrzne).

  • extern "C" określa, że funkcja jest zdefiniowana w innym miejscu i używa konwencji wywoływania języka C. Modyfikator extern "C" może być również stosowany do wielu deklaracji funkcji w bloku.

  • W deklaracji szablonu określa, extern że szablon został już utworzone w innym miejscu. extern informuje kompilator, że może ponownie użyć innego wystąpienia, a nie utworzyć nowego wystąpienia w bieżącej lokalizacji. Aby uzyskać więcej informacji na temat tego użycia programu extern, zobacz Jawne wystąpienie.

extern powiązania dla niezwiązanychconst z globalnymi

Gdy konsolidator zobaczy extern przed deklaracją zmiennej globalnej, szuka definicji w innej jednostce tłumaczenia. Deklaracje zmiennych innychconst niż w zakresie globalnym są externdomyślnie. Dotyczy extern tylko deklaracji, które nie zawierają definicji.

//fileA.cpp
int i = 42; // declaration and definition

//fileB.cpp
extern int i;  // declaration only. same as i in FileA

//fileC.cpp
extern int i;  // declaration only. same as i in FileA

//fileD.cpp
int i = 43; // LNK2005! 'i' already has a definition.
extern int i = 43; // same error (extern is ignored on definitions)

extern powiązania dla const globalnych

Zmienna const globalna ma domyślnie wewnętrzne powiązania. Jeśli chcesz, aby zmienna miała externpołączenie al, zastosuj extern słowo kluczowe do definicji i do wszystkich innych deklaracji w innych plikach:

//fileA.cpp
extern const int i = 42; // extern const definition

//fileB.cpp
extern const int i;  // declaration only. same as i in FileA

extern constexpr Powiązania

W programie Visual Studio 2017 w wersji 15.3 i starszej kompilator zawsze podał zmienną wewnętrzną constexpr powiązania, nawet jeśli zmienna została oznaczona .extern W programie Visual Studio 2017 w wersji 15.5 lub nowszej /Zc:externConstexpr przełącznik kompilatora umożliwia prawidłowe zachowanie zgodne ze standardami. Ostatecznie opcja stanie się domyślna. Opcja /permissive- nie włącza /Zc:externConstexpropcji .

extern constexpr int x = 10; //error LNK2005: "int const x" already defined

Jeśli plik nagłówka zawiera zadeklarowaną externconstexprzmienną , należy ją oznaczyć __declspec(selectany) , aby poprawnie zawierała zduplikowane deklaracje:

extern constexpr __declspec(selectany) int x = 10;

extern "C" i extern "C++" deklaracje funkcji

W języku C++, gdy jest używany z ciągiem, określa, extern że konwencje łączenia innego języka są używane dla deklaratorów. Dostęp do funkcji i danych języka C można uzyskać tylko wtedy, gdy zostały wcześniej zadeklarowane jako połączenie C. Należy je jednak zdefiniować w oddzielnie skompilowanej jednostce tłumaczenia.

Język Microsoft C++ obsługuje ciągi "C" i "C++" w polu literału ciągu. Wszystkie standardowe pliki dołączania używają extern "C" składni, aby umożliwić korzystanie z funkcji biblioteki czasu wykonywania w programach C++.

Przykład

W poniższym przykładzie pokazano, jak zadeklarować nazwy, które mają połączenie C:

// Declare printf with C linkage.
extern "C" int printf(const char *fmt, ...);

//  Cause everything in the specified
//  header files to have C linkage.
extern "C" {
    // add your #include statements here
#include <stdio.h>
}

//  Declare the two functions ShowChar
//  and GetChar with C linkage.
extern "C" {
    char ShowChar(char ch);
    char GetChar(void);
}

//  Define the two functions
//  ShowChar and GetChar with C linkage.
extern "C" char ShowChar(char ch) {
    putchar(ch);
    return ch;
}

extern "C" char GetChar(void) {
    char ch;
    ch = getchar();
    return ch;
}

// Declare a global variable, errno, with C linkage.
extern "C" int errno;

Jeśli funkcja ma więcej niż jedną specyfikację połączenia, musi się zgodzić. Jest to błąd deklarowania funkcji jako mających połączenie zarówno C, jak i C++. Ponadto, jeśli w programie występują dwie deklaracje funkcji, jedna ze specyfikacją połączenia i jedna bez, 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. 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.

Począwszy od programu Visual Studio 2019, gdy /permissive- jest określony, kompilator sprawdza, czy deklaracje parametrów extern "C" funkcji również są zgodne. Nie można przeciążyć funkcji zadeklarowanej jako extern "C". Począwszy od programu Visual Studio 2019 w wersji 16.3, można zastąpić to sprawdzanie przy użyciu /Zc:externC- opcji kompilatora /permissive- po tej opcji.

Zobacz też

Słowa kluczowe
Jednostki tłumaczenia i połączenie
extern Specyfikator klasy magazynu w języku C
Zachowanie identyfikatorów w języku C
Łączenie w języku C