extern
(C++)
Anahtar extern
sözcük genel değişkene, işleve veya şablon bildirimine uygulanabilir. Simgenin al bağlantısı olduğunu externbelirtir. Bağlantı ve genel değişkenlerin kullanımının neden önerilmez olduğu hakkında arka plan bilgileri için bkz . Çeviri birimleri ve bağlantı.
Anahtar sözcüğün extern
bağlama bağlı olarak dört anlamı vardır:
Genel olmayan
const
bir değişken bildiriminde,extern
değişkenin veya işlevin başka bir çeviri biriminde tanımlandığını belirtir. değişkenininextern
tanımlandığı dosya dışındaki tüm dosyalara uygulanmalıdır.Değişken
const
bildiriminde değişkenin external bağlantısı olduğunu belirtir. tümextern
dosyalardaki tüm bildirimlere uygulanmalıdır. (Genelconst
değişkenler varsayılan olarak iç bağlantıya sahiptir.)extern "C"
işlevin başka bir yerde tanımlandığını belirtir ve C dili çağırma kuralını kullanır. Değiştirici,extern "C"
bir bloktaki birden çok işlev bildirimine de uygulanabilir.Şablon bildiriminde,
extern
şablonun başka bir yerde zaten örneklendiğini belirtir.extern
derleyiciye, geçerli konumda yeni bir örnek oluşturmak yerine diğer örneklemeyi yeniden kullanabileceğini bildirir. bu kullanımıextern
hakkında daha fazla bilgi için bkz . Açık örnekleme.
extern
genel olmayanlarconst
için bağlantı
Bağlayıcı bir genel değişken bildiriminden önce gördüğünde extern
, tanımı başka bir çeviri biriminde arar. Genel kapsamda olmayan değişkenlerinconst
bildirimleri varsayılan olarak al'dır extern. Yalnızca tanımı sağlamayan bildirimler için geçerlidir extern
.
//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
geneller için const
bağlantı
Genel const
değişkenin varsayılan olarak iç bağlantısı vardır. Değişkenin al bağlantısı olmasını externistiyorsanız, anahtar sözcüğünü extern
tanıma ve diğer dosyalardaki diğer tüm bildirimlere uygulayın:
//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
Bağlantı
Visual Studio 2017 sürüm 15.3 ve önceki sürümlerinde, değişkeni işaretlendiğinde extern
bile derleyici her zaman bir constexpr
değişken iç bağlantı verdi. Visual Studio 2017 sürüm 15.5 ve sonraki sürümlerde /Zc:externConstexpr
, derleyici anahtarı doğru standartlara uygun davranışı etkinleştirir. Sonunda seçenek varsayılan seçenek haline gelir. /permissive-
seçeneği etkinleştirilmez/Zc:externConstexpr
.
extern constexpr int x = 10; //error LNK2005: "int const x" already defined
Üst bilgi dosyası bildirilen extern
constexpr
bir değişken içeriyorsa, yinelenen bildirimlerinin birleştirilmesi için doğru şekilde işaretlenmelidir __declspec(selectany)
:
extern constexpr __declspec(selectany) int x = 10;
extern "C"
ve extern "C++"
işlev bildirimleri
C++'ta, bir dize ile kullanıldığında, extern
bildirimciler için başka bir dilin bağlantı kurallarının kullanıldığını belirtir. C işlevlerine ve verilerine yalnızca daha önce C bağlantısı olduğu bildirilmişse erişilebilir. Ancak, ayrı olarak derlenmiş bir çeviri biriminde tanımlanmalıdır.
Microsoft C++ dizeleri "C"
ve "C++"
dize değişmez değeri alanında destekler. Tüm standart dahil dosyaları, çalışma zamanı kitaplığı işlevlerinin extern "C"
C++ programlarında kullanılmasına izin vermek için söz dizimini kullanır.
Örnek
Aşağıdaki örnek, C bağlantısı olan adların nasıl bildirildiğini gösterir:
// 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;
Bir işlevin birden fazla bağlantı belirtimi varsa, kabul etmesi gerekir. İşlevleri hem C hem de C++ bağlantısına sahip olarak bildirmek bir hatadır. Ayrıca, bir işlev için biri bağlantı belirtimi ve biri olmadan olmak üzere bir programda iki bildirim oluşursa, önce bağlantı belirtimini içeren bildirim olmalıdır. Zaten bağlantı belirtimine sahip olan işlevlerin yedekli bildirimlerine ilk bildirimde belirtilen bağlantı verilir. Örneğin:
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.
Visual Studio 2019'dan başlayarak, belirtildiğinde /permissive-
, derleyici işlev parametrelerinin bildirimlerinin de eşleştiğinden extern "C"
emin olarak denetler. olarak extern "C"
bildirilen bir işlevi aşırı yükleyemezsiniz. Visual Studio 2019 sürüm 16.3'den başlayarak, seçeneğin /Zc:externC-
ardından /permissive-
derleyici seçeneğini kullanarak bu denetimi geçersiz kılabilirsiniz.
Ayrıca bkz.
Anahtar Sözcükler
Çeviri birimleri ve bağlantı
extern C'de Depolama Sınıfı Tanımlayıcısı
C'de Tanımlayıcıların Davranışı
C'de bağlantı
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin