Soru Neden “extern const int n;” beklendiği gibi çalışmıyor?


Projem sadece iki kaynak dosyadan oluşmaktadır:

a.cpp:

const int n = 8;

b.cpp:

extern const int n;

int main()
{
    // error LNK2001: unresolved external symbol "int const n" (?n@@3HB)
    int m = n; 
}

Çalışması için birkaç yöntem olduğunu biliyorum; Ancak, ben sadece NEDEN çalışmıyor?


25
2018-02-15 12:24


Menşei


Değişmeyi dene a.cpp için extern const int n = 8; Bildiğim kadarıyla const ima staticAslında bilmiyorum. - Pubby
A.cpp'nin extern anahtar kelimesi ile n'nin nosyonunu görmesi gerekiyor mu?
Evet, iç bağlantıyı ima eder. - Luchian Grigore
Bunlar gcc ile derlenmiş c dosyaları olsaydı iyi çalışırdı. Bu etiketli C'ye sahip olmanın bir nedeni yok. - Mike
@xmllmx - C ++ 'da (ama muhtemelen C de değil) const int bir ile aynı static const int. Bu, a.cpp'deki değerin bu dosyanın dışında görünmediği anlamına gelir, bu yüzden b.cpp bunu göremez. - Bo Persson


Cevaplar:


Çünkü const iç bağlantıyı varsayılan olarak belirtir, "tanımınız" çeviri birimi dışında görünmüyor Nerede görünür.

Bu durumda, bugüne kadar en iyi çözüm beyanı koymaktır (extern int const n;) bir başlık dosyasında her ikisi de a.cpp ve b.cpp. Bağlantı tarafından belirlenir. derleyicinin gördüğü ilk bildirim, daha sonraki tanımı a.cpp Doğru (harici) bağlantıya sahip olacaktır.

Alternatif olarak, bağlantıyı tanımda zorlayabilirsiniz:

extern int const n = 8;

Rağmen externBu hala bir tanımdır; ile her şey sınıf tanımının dışındaki bir başlatıcı bir tanımdır.


43
2018-02-15 12:38





const ve constexpr C ++ 'daki değişkenler, ayrıca bildirilmemişse, iç bağlantıya (ve dolayısıyla diğer derleme biriminde erişilebilir değildir) sahiptir extern (tanımında ya da bir önceki beyanda).

C, durum böyle değil (iyi C değil mi constexpr) kodunuz geçerli ve daha fazla koyabilirsiniz extern bir tanım üzerinde.

Yani hem C hem de C ++ (ve iki bildirimin muhtemelen James'in işaret ettiği başlıktan gelmesi gerekir) kodunu yazmak istiyorsanız:

// a.cpp
extern const int n;
const int n = 8;

// b.cpp
extern const int n;

int main()
{

    int m = n; 
}

eğer yapmazsan

// a.cpp
extern const int n = 8;

ayrıca mümkündür


5
2018-02-15 12:39





Onu a.cpp'de extern olarak ilan edin ve b.cpp'de extern olmadan kullanın:

Ah

extern const int n ;

a.cpp

#include "a.h"
...
const int n= 8

b.cpp:

#include "a.h"
...


int main()
{        
    int m = n; 
}

2
2018-02-15 12:28



Hmm, bunu bir başlık dosyasıyla yapardım. Başlık ile extern dahil en basit yoludur. - Gjordis
Aslında sen yapmalısın Kaldır  const int n; b.cpp'den. İçerilen başlık gerekli olan şeydir. - Roddy


To share a const object among multiple files, you must define the variable as extern.

To define a single instance of a const variable, we use the keyword extern on both its definition and declaration(s):

Bu kurallardan sadece eklemeniz gerekir extern tanımınızda anahtar kelime. Bildirimde zaten var.


2
2018-02-15 12:44





Buradaki diğer cevaplar hile yapmazsa, farklı ad alanlarınızdaki tanımlarınız varsa, derleme geçerse ... undefined symbol bağlayıcı hatası:

  • tanımsız sembolün isim alanını kontrol edin; Bu etkili ad alanı için extern const int n beyanı.
  • yaptığınız yerdeki etkili ad alanınız olduğundan emin olun const int n = 8 tanım.

1
2018-04-26 16:50