2009-11-07 18 views
11

Boyutu extern const olarak tanımlanmış bir dizi başlatırken bir sorunum var. Küresel değişkenlerin üstbilgi dosyalarında extern olarak bildirilmesi kuralını her zaman izledim ve değişken tanımlama hatalarını önlemek için uygulama dosyalarından birinde karşılık gelen tanımların olması gerekir. Bu yaklaşım, boyutu dışsal bir kurgu olarak tanımlanmış bir diziyi başlatmam gerekene kadar iyi çalıştı. Sabit bir ifadenin beklendiği konusunda bir hata alıyorum. Ancak, const değişkenine bir değer atamaya çalışırsam, derleyici, bir değerin sabit bir değişkene atanamadığından şikayet eder. Bu aslında derleyicinin değişkeni sabit olarak gördüğünü kanıtlar. Aynı boyutta bir dizi bildirmeye çalıştığımda neden bir hata bildirilir?Boyutu extern const olarak bildirilmiş bir dizi bildirme

#define kullanmadan bundan kaçınmanın bir yolu var mı? Bu hatanın sebebini de bilmek isterim.

Package.h:

#ifndef PACKAGE_H 
#define PACKAGE_H 

extern const int SIZE; 

#endif 

Package.cpp:

#include "Package.h" 

const int SIZE = 10; 

foo.cpp:

#include "Package.h" 

int main() 
{ 
    // SIZE = 5; // error - cannot assign value to a constant variable 
    // int Array[SIZE]; // error - constant expression expected 
    return 0; 
} 
+0

Kodu biçimlendirmek için dört boşluk girintilendirebilirsiniz. – Thomas

cevap

16

Sabit haricidir, bu nedenle başka bir derleme biriminde tanımlanır (.o dosya). Bu nedenle derleyici, derleme süresinde dizininizin boyutunu belirleyemez; Bağlantının zamanının, sabitin değerinin ne olacağı bilinmez.

3

Eh, const nitelikli olarak, değişken görür değil sabit bir ifadesi olarak.

2

Buradaki problem, değişkeninizi extern olarak bildirirseniz, farklı bir modülde (.o dosyası) veya hatta dinamik bir kütüphanede (.dll/.so) olmasına izin verdiğine inanıyorum. Elbette ki derleyici, değişken içeriği derleme zamanında çözemeyebilir ve böylece bir const'ın gerekli olduğu değeri kullanmayı reddedebilir.

Benim düşüncem şudur: burada extern'i kullanmamak ve doğrudan başlık dosyasında bildirmemek, kodda herhangi bir yerde kullanıldığında belirtilecek olan bir int değeri olduğu için, bu tamamen uygun değildir. Ben genellikle extern const'ı sadece dizelerle çalışırken kullanırım, çünkü çalışma zamanında dizenin yalnızca bir örneğinin üretildiğinden emin olmak isterim.

3

Yalnızca bir int olduğu için extern'u kaldırır ve bir bildirimden ziyade bir tanım yapardım. Bunun sebebi, bu yaklaşımın, başlık içeren her bir kaynak dosyasında tamsayıyı ayrı bir örneğini oluşturmasına rağmen, çoğu derleyicinin kullanımını en iyi şekilde kullanacağını hayal edeceğim. Aslında, derleyicinin kullanımını optimize etmesinin imkansız olması, basit aritmetik ifadelerden optimize edilmeyecektir.

const bildirildiği için, iç bağlantıya sahip olacak ve böylece bu şekilde yaparak çok tanımlı bir simge sorunu almayacaksınız.

+0

Teşekkürler. Sanırım şimdi anlıyorum. Ancak, bu yaklaşım neden const işaretçileri için çalışmıyor. Başlık dosyasındaki const char * FILE_NAME = "Log.txt" öğesini tanımlarım ve üstbilgi dosyasını birden çok kaynak dosyaya dahil etmem gerekirse, yine de bir bağlantı hatası alıyorum. FILE_NAME deyimi const hatası için bir hata alamıyorum [] = "Log.txt " – psvaibhav

+0

@psvaibhav: Bu işe yaramaz çünkü' const char * 'işaretçiyi bir const-const-const ve sabit bir işaretçi olarak belirtir. İhtiyacınız olan şey, ekstra bir' const'' sonra '' 'yapmak işaretçi kendisi sabit yani 'const char * const' – Troubadour

İlgili konular