2012-11-23 24 views
9

Zwykłe stałe zmienne w C++ domyślne dla wewnętrznego powiązania. Załóżmy Jeśli mam następujące:Zwykłe zmienne stałe w C++

  • I zdefiniować zmienną const w pliku nagłówkowym (const int var = 2)

  • Potem zawierać nagłówek w dwóch cpp plików.

jeśli staram się adres tej zmiennej const (tj &var) w obu plikach CPP, wtedy te dwa adresy są takie same? Potrzebuję też małego działającego kodu, aby zweryfikować ten fakt.

Musiałem opublikować to pytanie, ponieważ nie mogłem go tam zapytać w komentarzach do this answer podanych w tym temacie, ponieważ jestem początkującym.

+2

Przypuszczam, że jesteś zainteresowany C++. C jest zupełnie inne ze swoimi regułami. Dlatego sugeruję usunięcie tagu C. –

+4

Z pewnością zajmie to tylko chwilę, aby przetestować? – Rook

+0

@Rook: Nie. "" A "==" a "w moim systemie, ale w rzeczywistości nie jest to gwarantowane. – MSalters

Odpowiedz

5

Dla C++ nie będzie to samo ze względu na wewnętrzne połączenie - są to 2 różne obiekty. W przypadku C jest odwrotnie, a const ma połączenie zewnętrzne, dlatego pojawi się błąd powiązania z powodu redefinicji.

+0

Tak właśnie myślę. Ale odpowiedź w linku, o którym wspomniałem, mówi, że to będzie to samo. –

+0

To nie jest to, co tam powiedziano. Przeczytaj uważnie - "ten sam" adres w tej odpowiedzi jest taki sam, ponieważ jest to ta sama globalna zmienna. Powinieneś przeczytać trochę o znaczeniu słowa kluczowego 'extern' i zmiennych globalnych. – SomeWittyUsername

+0

@UchiaItachi źle odczytałeś tę odpowiedź. Mówi się, że jeśli * zadeklarujesz je jako zewnętrzne w nagłówku * i * zdefiniujesz je w jednym pliku '.cc', otrzymasz ten sam adres. –

0

Zmienne będą miały różne adresy. Jest również możliwe, że jeśli nie podasz adresu zmiennej, gdzie zmienna zostanie zastąpiona jego wartością podczas kompilacji, w pliku binarnym nie znajdziesz w ogóle wartości zmiennej.

+0

jeśli nie ma odniesienia, zmienna i jej wartość może być w ogóle pominięta z pliku binarnego, a nie podstawionego – SomeWittyUsername

2

następnie te dwa adresy będą takie same?

nr Ponieważ nagłówki są zawarte w plikach * .cpp podczas kompilacji, więc każdy * .cpp, który zawiera nagłówek stworzy swoją własną stałą.

Jeśli jednak używasz extern const int var; w nagłówku i ustawisz wartość domyślną w * .cpp, powinny być takie same.