2011-10-25 31 views
7

Derleyici, C veya C++ (örneğin gcc), const bildirimini nasıl onurlandırır?"const" nasıl uygulanır?

Örneğin, aşağıdaki kodda, derleyici değişken ciconst ve değiştirilemez olduğunu izlemek tutar edebilir?

int 
get_foo() { 
    return 42; 
} 

void 
test() 
{ 
    int i = get_foo(); 
    i += 5; 

    const int ci = get_foo(); 
    // ci += 7; // compile error: assignment of read-only variable ?ci? 
} 
+5

Aynı şekilde, tüm derleme zamanı bilgilerinin varlığını takip eder. iables? –

+0

Tip sistemiyle derleme zamanında yapılır. –

+1

Yorumunuz "salt okunur değişkene atama" yazmalıdır. BTW Derleyicinin tamsayı olduğunu nereden biliyorsunuz? – hplbsh

cevap

9

Değişkenler için diğer herhangi bir sembol bilgisi (adres, tür vb.) Gibi. Genellikle, beyan edilen tanımlayıcılarla ilgili bilgileri depolayan bir sembol masası vardır ve bu, tanımlayıcıya başka bir başvuruyla karşılaştığı zaman buna danışılır.

(Daha ilginç bir soru, bu bilginin yalnızca derleme sırasında veya çalışma sırasında mevcut olup olmadığıdır. Çoğu dil, derlendikten sonra sembol tablosunu atar, böylece derlenmiş kodu manipüle edebilir ve tanımlayıcı bildirilmiş olsa bile yeni bir değeri zorlayabilirsiniz 'const'. Bunu önlemek için sofistike bir çalışma zamanı sistemi (ve kod imzalama) alır.)

+0

Buna ek olarak, C++/C Derleyicisi standart bir sorun, çalışma zamanında bu "const" gibi bir değişken tutmak için bir şey yapmazsa, bu değeri sembol tablosundan değiştirebilecek herhangi bir kod üretmemeyi bilir Kilian bahsetti. Sonuç olarak, başka bir derleyici bazı kodlar oluşturabilir ve bu kod işleme yüklenirse, o konumdaki belleğin üzerine yazabilir. Bu kötü. – Dlongnecker

+1

Const verileri farklı bir bellek bloğu içine yerleştirilebilir ve bazı sistemlerde bellek bloğu aslında salt okunur olarak işaretlenir. Kodun kendisi farklı bir segmentte bulunduğu gibi (belki de const verileri ve kodu karıştırılabilir). Tabii ki bu sadece statik varlıklar ve yığında yaratılan hiçbir şey için geçerli değildir. –

1

derleyici satır

const int ci = get_foo(); 

diğer fonksiyonlara etrafında ci geçmesi veya başka değişkenlere atamak gibi öylesine söyledim çünkü ciconst olduğunu bilir, derleyici const- olduğunu korur Potansiyel olarak değerini değiştirebilecek bir şey yapmanı engelleyerek ness. Örneğin, aşağıdakiler derleyici hatası üretir.

int *ci2 = &ci; 
(*ci2)++; 

Derleyici, ci değerini değiştirmenize izin vermeyecektir. Tabii

+0

Son örneğiniz, arttırma işlemi olmadan bile bir derleyici hatası üretmelidir. Bir işaretçi-const olmayan değişkeni için bir işaretçi-const değeri atayamaz. – Novelocrat

3

her derleyici uygulanması kalmış, ancak kısaca, bu tür değişkenin türü olarak ve olsun veya olmasın diğer bilgilerle birlikte onun değişken simge tablosunda (varsa) değişkenin const ve volatile eleme saklar Bu bir işaretçi/referanstır.

+0

"CV niteleyicileri"? Kesinlikle değişkenlerin özgeçmişleri yoktur! – Gabe

+1

@Gabe: Standart, bölüm 3.9.3 "CV Niteleyiciler" bölümünde onlar hakkında çok fazla konuşur (konstrüktif/uçucu). –

1

Eminim ki diğerleri daha fazla detaylandırabilir, ama kısaca evet. Derleyici, tüm tür belirticilerin kaydını tutar, böylece ci "const int" türünde olduğunu ve "int" türünün olmadığını bilir.

1

Diğerlerinin dediği gibi, derleyici int değişkeninin olduğu gibi derleyicinin izlediği gibi const derleyici tarafından izlenir. Aslında, en azından gcc'nin const int'u int'dan ayrı bir tür olarak kabul ettiğini okudum, bu yüzden bir değiştirici olarak takip edilmiyor, bir int ile aynı şekilde izleniyor.

aslında işaretçi döküm yolu ile const değerini değiştirebilirsiniz Not ama sonuç tanımlanmamış: gcc kullanarak makinede

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
     const int c = 0; 
     printf("%d\n", c); 
     ++*(int*)&c; 
     printf("%d\n", c); 
} 

, bu

0 
1 

Fakat ile derleme yazdırır g ++,

verir
0 
0