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 innej
const
niż globalna określa,extern
że zmienna lub funkcja jest zdefiniowana w innej jednostce tłumaczenia. Elementextern
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. Elementextern
należy zastosować do wszystkich deklaracji we wszystkich plikach. (Zmienne globalneconst
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. Modyfikatorextern "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 programuextern
, 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:externConstexpr
opcji .
extern constexpr int x = 10; //error LNK2005: "int const x" already defined
Jeśli plik nagłówka zawiera zadeklarowaną extern
constexpr
zmienną , 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
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla