Przestarzała konwersja z literalnego łańcucha znaków na ' char*'
Mam program, który deklaruje tablicę łańcuchów takich jak:
char *colors[4] = {"red", "orange", "yellow", "blue"};
Ale dostaję powyższe Ostrzeżenie kompilatora. To kompiluje, ale wolałbym użyć nie-deprecated sposób(jeśli istnieje). Próbowałem dowiedzieć się, co to znaczy, ale nie mogę tego rozgryźć. Słyszałem użycie 'const ' zanim' char ' działa, ale byłoby pomocne, gdyby ktoś mógł wyjaśnić, co oznacza błąd. Dzięki.
3 answers
Łańcuchy, które wprowadzasz: "red", "organge" itd są "dosłowne", ponieważ są zdefiniowane wewnątrz samego kodu programu (nie są odczytywane bezpośrednio z dysku, wejścia użytkownika /stdin itp.).
Oznacza to, że jeśli w którymkolwiek momencie spróbujesz napisać do swojego colors
, uzyskasz bezpośredni dostęp do oryginalnego wejścia i w ten sposób je edytujesz. Spowodowałoby to pewne niepożądane błędy w czasie wykonywania.
Zadeklarowanie go jako const sprawi, że nigdy nie będziesz próbował pisać do tego wskaźnika i takiego można uniknąć błędu czasu pracy.
const char *colors[4] = {"red", "orange", "yellow", "blue"};
Jeśli kiedykolwiek masz ochotę edytować te wartości w czasie wykonywania, powinieneś najpierw skopiować ciągi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-11 14:33:42
"red", "orange", "yellow", "blue"
Są to ciągi stałe. Tworzenie wskaźnika non-const na ciąg stały jest błędne, stąd Ostrzeżenie. W tej chwili dostajesz Ostrzeżenie, ale powinien to być błąd, ponieważ jest przestarzały w c++03, A zabroniony w c++11.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-10 20:50:54
Wszystkie odpowiedzi są poprawne.
Zauważ, że jeśli masz funkcję wymagającą tablicy znaków jako argumentu i przekazujesz ten argument w następujący sposób:
foo ("bar");
Zostanie wyświetlone to samo ostrzeżenie. W tym przypadku możesz:
1) Zmień to tak, jak wyjaśniono w pierwszej odpowiedzi:
void foo (char[] str) { printf(str); }
const char param[] = "bar";
foo (param);
2) rozważ użycie standardowego ciągu C++, jak tak:
void foo (std::string theParam) { std::cout << theParam; }
foo ("bar");
IMHO, o ile nie chodzi o realne problemy z wydajnością i nie pracujesz z C biblioteki, lub jeśli budujesz bibliotekę C++ dla innych, powinieneś raczej pracować z ciągami niezmiennymi C++ i ich zestawem funkcji.
Jeśli Unicode jest wymogiem, wsparcie w C++ jest "straszne", jak wyjaśniono tutaj.
to pytanie daje kilka wskazówek (głównie: użyj biblioteki IBM ICU). Jeśli masz już Qt w swoim projekcie, QString
również wykona tę sztuczkę, podobnie jak Gettext.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:34