Aracılığıyla paylaş


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 olmayanconst bir değişken bildiriminde, extern değişkenin veya işlevin başka bir çeviri biriminde tanımlandığını belirtir. değişkeninin extern 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üm extern dosyalardaki tüm bildirimlere uygulanmalıdır. (Genel const 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ı externhakkı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 externbile 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 constexprbir 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ı