Jak pozbyć się ostrzeżeń 'deprecated conversion z ciągów znaków na' char*" w GCC?

Więc pracuję nad niezwykle dużą bazą kodową, A Ostatnio zaktualizowaną do gcc 4.3, która teraz uruchamia to Ostrzeżenie:

Warning: deprecated conversion from string constant to 'char*'

Oczywiście, poprawnym sposobem, aby to naprawić, jest znalezienie każdej deklaracji, takiej jak

char *s = "constant string";

Lub wywołanie funkcji w stylu:

void foo(char *s);
foo("constant string");

I zrób z nich const char wskaźniki. Oznaczałoby to jednak dotknięcie minimum 564 plików, co nie jest zadaniem, które chciałbym wykonać w tym momencie w czas. Problem polega na tym, że biegam z -werror, więc potrzebuję sposobu na stłumienie tych ostrzeżeń. Jak mogę to zrobić?

 386
Author: stackptr, 2008-09-12

23 answers

Wierzę, że przekazanie -Wno-write-strings do gcc stłumi to Ostrzeżenie.

 217
Author: DGentry,
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
2011-10-08 00:26:28

Wszelkie funkcje, do których przekazujesz literały łańcuchowe "I am a string literal" powinny używać char const * jako typu zamiast char*.

Jeśli chcesz coś naprawić, napraw to dobrze.

Explanation:

Nie można używać literałów łańcuchowych do inicjalizacji łańcuchów, które zostaną zmodyfikowane, ponieważ są typu const char*. Odrzucenie konsternacji, aby później je zmodyfikować, jest niezdefiniowanym zachowaniem, więc musisz skopiować swoje const char* ciągi char przez char do dynamicznie przydzielanych char* łańcuchy w celu ich modyfikacji.

Przykład:

#include <iostream>

void print(char* ch);

void print(const char* ch) {
    std::cout<<ch;
}

int main() {
    print("Hello");
    return 0;
}
 535
Author: John,
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
2018-10-03 16:42:23

Sprawdź obsługę GCC Diagnostic Pragma oraz listę - w warning options (zmieniony: nowy link do warning options).

Dla gcc, możesz użyć #pragma warning dyrektyw jak wyjaśniono tutaj .

 69
Author: Rob Walker,
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:54:59

Miałem podobny problem, rozwiązałem go tak:

#include <string.h>

extern void foo(char* m);

int main() {
    // warning: deprecated conversion from string constant to ‘char*’
    //foo("Hello");

    // no more warning
    char msg[] = "Hello";
    foo(msg);
}

Czy to jest odpowiedni sposób na rozwiązanie tego problemu? Nie mam dostępu do foo, aby dostosować go do accept const char*, chociaż byłoby to lepsze rozwiązanie (ponieważ foo nie zmienia się m).

 68
Author: BlackShift,
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
2015-12-22 22:43:01

Jeśli jest to aktywna baza kodu, nadal możesz chcieć ją uaktualnić. Oczywiście ręczne wykonanie zmian nie jest możliwe, ale uważam, że ten problem można rozwiązać raz na zawsze za pomocą jednego polecenia sed. Nie próbowałem tego, jednak, więc weź następujące z przymrużeniem oka.

find . -exec sed -E -i .backup -n \
    -e 's/char\s*\*\s*(\w+)\s*= "/char const* \1 = "/g' {} \;

Może to nie znaleźć wszystkich miejsc (nawet nie biorąc pod uwagę wywołań funkcji), ale złagodziłoby problem i umożliwiłoby wykonanie kilku pozostałych zmian ręcznie.

 29
Author: Konrad Rudolph,
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
2008-09-12 18:49:22

Nie mogę użyć przełącznika kompilatora. Więc to przemieniłem:

char *setf = tigetstr("setf");

Do tego:

char *setf = tigetstr((char *)"setf");
 25
Author: vy32,
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
2009-08-21 02:14:26

Oto Jak to zrobić inline w pliku, więc nie musisz modyfikować swojego pliku Makefile.

// gets rid of annoying "deprecated conversion from string constant blah blah" warning
#pragma GCC diagnostic ignored "-Wwrite-strings"
Możesz później...
#pragma GCC diagnostic pop
 24
Author: EdH,
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
2011-11-15 17:54:04

Zastąp

char *str = "hello";

Z

char *str = (char*)"hello";

Lub jeśli wywołujesz funkcję:

foo("hello");

Zastąp to przez

foo((char*) "hello");
 22
Author: takataka,
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
2015-12-22 22:46:37

Zamiast:

void foo(char *s);
foo("constant string");

To działa:

void foo(const char s[]);
foo("constant string");
 15
Author: John,
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
2014-10-04 15:28:22

W C++ użyj const_cast Jak poniżej

char* str = const_cast<char*>("Test string");
 13
Author: appapurapu,
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
2015-12-22 22:44:13

Test string jest ciągiem konst. Więc możesz rozwiązać tak:

char str[] = "Test string";

Lub:

const char* str = "Test string";
printf(str);
 7
Author: alexsid,
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-09-14 14:19:26

Dlaczego po prostu nie użyć odlewania typu?

(char*) "test"
 5
Author: Dario,
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
2015-12-22 22:44:34

Czy typecasting ze stałego łańcucha znaków do wskaźnika znakowego, tzn.

char *s = (char *) "constant string";
 3
Author: tejp124,
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
2015-12-22 22:45:51

Można również utworzyć zapisywalny ciąg znaków ze stałej łańcuchowej, wywołując strdup().

Na przykład, ten kod generuje ostrzeżenie:

putenv("DEBUG=1");

Jednak poniższy kod nie (robi kopię łańcucha na stercie przed przekazaniem go do putenv):

putenv(strdup("DEBUG=1"));

W tym przypadku (i być może w większości innych) wyłączenie ostrzeżenia jest złym pomysłem - jest tam nie bez powodu. Inną alternatywą (domyślnie zapisywalną dla wszystkich łańcuchów) jest potencjalnie nieefektywne.

Posłuchaj, co mówi kompilator!

 2
Author: BillAtHRST,
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
2011-11-09 16:26:46

Zobacz tę sytuację:

typedef struct tagPyTypeObject
{
    PyObject_HEAD;
    char *name;
    PrintFun print;
    AddFun add;
    HashFun hash;
} PyTypeObject;

PyTypeObject PyDict_Type=
{
    PyObject_HEAD_INIT(&PyType_Type),
    "dict",
    dict_print,
    0,
    0
};

Obserwuj pole nazwa, w gcc kompiluje się bez ostrzeżenia, ale w g++ będzie, nie wiem dlaczego.

 1
Author: shindow,
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
2011-08-01 08:25:31

W C++ Zastąp:

char *str = "hello";

Z:

std::string str ("hello");

A jeśli chcesz to porównać:

str.compare("HALLO");
 1
Author: Sohrab,
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-12-21 12:56:22

Nie rozumiem jak zastosować rozwiązanie: (- kalmanIsAGameChanger

Pracując z Arduino Sketch, miałem funkcję powodującą moje Ostrzeżenia.

Oryginalna funkcja: Char StrContains (char *str, char * sfind)

Aby zatrzymać Ostrzeżenia dodałem const przed char *str i char *sfind.

Modified: Char StrContains (const char *str, const char *sfind).

Wszystkie ostrzeżenia zniknęły.
 1
Author: MyGEARStationcom,
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
2018-03-08 20:03:34

Wystarczy użyć opcji-w dla g++

Przykład:

G++ -W-O proste.o proste.cpp-lpthread

Pamiętaj, że nie pozwala to uniknąć deprecjacji, a raczej zapobiega wyświetlaniu komunikatu ostrzegawczego na terminalu.

Teraz, jeśli naprawdę chcesz uniknąć deprecjacji, użyj słowa kluczowego const w ten sposób:

const char* s="constant string";  
 0
Author: Md. Arafat Al Mahmud,
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-06-08 16:43:11

Dlaczego nie użyjesz opcji -Wno-deprecated, aby zignorować przestarzałe komunikaty ostrzegawcze?

 0
Author: Drew Noakes,
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-03-06 22:24:57

ODPOWIEDŹ BlackShift jest bardzo pomocna, a ja użyłem jej tak:

extern string execute(char* cmd) {
            FILE* pipe = popen(cmd, "r");
            if (!pipe) return "ERROR";
            char buffer[256];
            std::string result = " ";
            while(!feof(pipe)) {
                    if(fgets(buffer, 128, pipe) != NULL)
                            result += buffer;
            }
            pclose(pipe);
            return result;
    }
    int main(){
            char cmd[]="grep -A1 'xml' out1.txt  | grep read|awk -F'=' 'BEGIN{sum=0}{sum=sum+$NF}END{print sum}'";
            string result=execute(cmd);
            int numOfBytes= atoi(result.c_str());   
            cout<<"Number of bytes = "<<numOfBytes<<endl;
            return 0;
    }
 0
Author: coder,
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-07-25 10:25:20

Problem polega na tym, że uruchamiam się z-Werror

To jest twój prawdziwy problem, IMO. Możesz wypróbować kilka zautomatyzowanych sposobów przejścia z (char *) do (const char *), ale postawiłbym na nie pieniądze nie tylko działające. Będziesz musiał zaangażować człowieka do przynajmniej części pracy. Na krótką metę, po prostu zignoruj Ostrzeżenie (ale IMO zostaw je włączone, albo nigdy nie zostanie naprawione) i po prostu usuń-Werror.
 0
Author: James Antill,
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
2015-12-30 04:44:03

Dzięki wszystkim za pomoc. Wybierając stąd i tam pojawia się takie rozwiązanie. To jest czyste. Nie testowałem jeszcze kodu. Jutro... może...

const char * timeServer[] = { "pool.ntp.org" }; // 0 - Worldwide 
#define WHICH_NTP            0 // Which NTP server name to use.
...
sendNTPpacket(const_cast<char*>(timeServer[WHICH_NTP])); // send an NTP packet to a server
...
void sendNTPpacket(char* address) { code }

Wiem, że jest tylko 1 pozycja w tablicy timeServer. Ale może być więcej. Reszta została na razie skomentowana, aby zachować pamięć.

 0
Author: Micheal Morrow,
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
2016-03-05 11:47:49
PyTypeObject PyDict_Type=
{ ...

PyTypeObject PyDict_Type=
{
  PyObject_HEAD_INIT(&PyType_Type),
                     "dict",
                     dict_print,
                     0,
                     0
}; 

Obserwuj pole nazwa, w gcc kompiluje się bez ostrzeżenia, ale w g++ będzie, nie wiem dlaczego.

W gcc (Compiling C),- Wno-write-strings jest domyślnie aktywne.

In g++ (Compiling C++) - Wwrite-strings jest domyślnie aktywne

Dlatego istnieje inne zachowanie. Dla nas używanie makr Boost_python generuje takie ostrzeżenia. Więc używamy -Wno-write-strings podczas kompilacji C++, ponieważ zawsze używamy -Werror

 -1
Author: msn,
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-10-22 03:51:50