2013-04-05 8 views
11

Wspólny nagłówek.Dlaczego "statyczny" jest potrzebny do globalnego znaku stałego, ale nie do znaku bool?

mogę to zrobić:

const bool kActivatePlayground=false;

działa poprawnie, gdy włączone wśród wielu plików.

Nie mogę tego zrobić:

const char * kActivePlayground = "kiddiePool";

wyniki w błędzie: zduplikowane symboli.

Ale to działa:

static const char * kActivePlayground = "kiddiePool";

Dlaczego static potrzebne do const char * ale nie dla const bool? Dodatkowo, myślę, że static nie jest konieczne, ponieważ const jest zawsze implikowana w postaci?

+0

static powoduje, że symbol jest prywatny dla tej JT. od błędu, czy upewniłeś się, że nie ma redefinicji znaku const * w żadnym innym pliku ?. –

+0

to jest jedyna definicja nazwy zmiennej – johnbakers

+0

ponownie, i ponownie ją sprawdzam: 'const' jest niejawnie' static' tak, więc użycie słowa 'static' nie powinno być nawet konieczne, tak jak to nie jest niezbędne dla 'bool' – johnbakers

Odpowiedz

26

W C++, const zmienne domyślnie mają połączenie statyczne, podczas gdy zmienne inne niż const mają powiązania zewnętrzne.

Przyczyną błędu wielokrotnej definicji jest to, że

const char * kActivePlayground = "kiddiePool"; 

tworzy zmienną z zewnętrznym wiązaniem.

Hej, czekaj, czy nie powiedziałem, że zmienne domyślne to statyczne powiązanie? Tak. Ale kActivePlayground nie jest const. Jest to wskaźnik inny niż const dla const char.

To będzie działać zgodnie z oczekiwaniami:

const char * const kActivePlayground = "kiddiePool"; 
+0

rzeczywiście, dzięki. nie mogę uwierzyć, że tęskniłem za tym. – johnbakers

+0

Dzięki, Ben. Też tęskniłem za tym i łamałem sobie głowę próbując zobaczyć, jak to nie kwalifikuje się jako wewnętrzne powiązanie (wylewając ponad 3,5 powtórzone powiedzmy wtf do mnie). Niezła odpowiedź. – WhozCraig

+2

Dlatego też będę się spierał (w stosunku do użytkowników języka angielskiego), że 'const' zawsze powinien znajdować się w * prawej * tego, co kwalifikuje,' const char * 'może sprawić, że będziesz wątpił, ale' char const * 'nie będzie. –

0

Można użyć stałą tablicę char

const char kActivePlayground[] = "kiddiePool"; 

i kActivePlayground mogą być również wykorzystywane do przypisania, ponieważ jest to odniesienie

const char* playground_text = kActivePlayground; 
Powiązane problemy