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.

Author: rstackhouse, 2012-03-10

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.

 77
Author: d_inevitable,
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.

 10
Author: BЈовић,
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.

 5
Author: tiktak,
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