Aracılığıyla paylaş


Çeviri birimleri ve bağlantı

C++ programında, bir değişken veya işlev adı gibi bir simge, kapsamı içinde istediğiniz sayıda bildirilebilir. Ancak, yalnızca bir kez tanımlanabilir. Bu kural , "Tek Tanım Kuralı" (ODR) kuralıdır. Bildirim, adı daha sonra bir tanımla ilişkilendirmek için yeterli bilgiyle birlikte bir adı programa tanıtır (veya yeniden ekler). Tanım bir ad tanıtır ve bunu oluşturmak için gereken tüm bilgileri sağlar. Ad bir değişkeni temsil ederse, tanım açıkça depolama alanı oluşturur ve onu başlatır. İşlev tanımı , imzanın yanı sıra işlev gövdesinden oluşur. Sınıf tanımı, tüm sınıf üyelerini listeleyen bir bloğun ardından sınıf adından oluşur. (Üye işlevlerin gövdeleri isteğe bağlı olarak başka bir dosyada ayrı olarak tanımlanabilir.)

Aşağıdaki örnekte bazı bildirimler gösterilmektedir:

extern int i;
int f(int x);
class C;

Aşağıdaki örnekte bazı tanımlar gösterilmektedir:

int i{42};
int f(int x){ return x * i; }
class C {
public:
   void DoSomething();
};

Bir program bir veya daha fazla çeviri biriminden oluşur. Çeviri birimi bir uygulama dosyasından ve doğrudan veya dolaylı olarak içerdiği tüm üst bilgilerden oluşur. Uygulama dosyaları genellikle veya .cxxdosya uzantısına .cpp sahiptir. Üst bilgi dosyaları genellikle veya .hppuzantısına .h sahiptir. Her çeviri birimi derleyici tarafından bağımsız olarak derlenmiş. Derleme tamamlandıktan sonra bağlayıcı derlenmiş çeviri birimlerini tek bir programda birleştirir. ODR kuralının ihlalleri genellikle bağlayıcı hataları olarak gösterilir. Aynı ad birden fazla çeviri biriminde tanımlandığında bağlayıcı hataları oluşur.

Genel olarak, bir değişkeni birden çok dosyada görünür hale getirmenin en iyi yolu bunu bir üst bilgi dosyasında bildirmektir. Ardından, bildirimi gerektiren her .cpp dosyaya bir #include yönerge ekleyin. Üst bilgi içeriğinin çevresine ekleme koruyucuları ekleyerek, bir üst bilginin bildirdiği adların her çeviri birimi için yalnızca bir kez bildirildiğinden emin olursunuz. Adı tek bir uygulama dosyasında tanımlayın.

C++20'de modüller, üst bilgi dosyalarına geliştirilmiş bir alternatif olarak sunulmuştur.

Bazı durumlarda, bir dosyada .cpp genel değişken veya sınıf bildirmek gerekebilir. Böyle durumlarda, derleyiciye ve bağlayıcıya adın ne tür bir bağlantı olduğunu bildirmek için bir yol gerekir. Bağlantı türü, nesnenin adının yalnızca bir dosyada mı yoksa tüm dosyalarda mı görünür olduğunu belirtir. Bağlantı kavramı yalnızca genel adlar için geçerlidir. Bağlantı kavramı, kapsam içinde bildirilen adlar için geçerli değildir. Kapsam, işlev veya sınıf tanımları gibi bir dizi kapsayan küme ayracı tarafından belirtilir.

Dış ve iç bağlantı karşılaştırması

Ücretsiz işlev, genel veya ad alanı kapsamında tanımlanan bir işlevdir. Sabit olmayan genel değişkenler ve serbest işlevler varsayılan olarak dış bağlantıya sahiptir; bunlar programdaki herhangi bir çeviri ünitesinden görülebilir. Başka hiçbir genel nesne bu ada sahip olamaz. İç bağlantı içeren veya bağlantı olmayan bir simge yalnızca bildirildiği çeviri birimi içinde görünür. Bir adın iç bağlantısı olduğunda, aynı ad başka bir çeviri biriminde bulunabilir. Sınıf tanımları veya işlev gövdeleri içinde bildirilen değişkenlerin bağlantısı yoktur.

Genel adı açıkça olarak staticbildirerek iç bağlantıya sahip olmasını zorlayabilirsiniz. Bu anahtar sözcük görünürlüğünü bildirildiği çeviri birimiyle sınırlar. Bu bağlamda, static yerel değişkenlere uygulandığından farklı bir şey anlamına gelir.

Aşağıdaki nesnelerin varsayılan olarak iç bağlantısı vardır:

  • const Nesne
  • constexpr Nesne
  • typedef Nesne
  • static ad alanı kapsamındaki nesneler

Bir const nesneye dış bağlantı vermek için bunu olarak extern bildirin ve bir değer atayın:

extern const int value = 42;

Daha fazla bilgi için bkz. extern.

Ayrıca bkz.

Temel kavramlar