Как избавиться от `устаревшего преобразования из строковой константы в предупреждения 'char *'` в GCC? - PullRequest
397 голосов
/ 12 сентября 2008

Итак, я работаю над чрезвычайно большой кодовой базой, и недавно она была обновлена ​​до gcc 4.3, который теперь вызывает это предупреждение:

предупреждение: устаревшее преобразование из строковой константы в 'char * ’

Очевидно, что правильный способ исправить это - найти каждое объявление вроде

char *s = "constant string";

или вызов функции, такой как:

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

и сделайте из них const char указатели. Однако это означало бы касание как минимум 564 файлов, что не является задачей, которую я хочу выполнить в данный момент. Проблема сейчас в том, что я работаю с -werror, поэтому мне нужен какой-то способ подавить эти предупреждения. Как я могу это сделать?

Ответы [ 23 ]

7 голосов
/ 17 марта 2010

Test string является константной строкой. Так что вы можете решить так:

char str[] = "Test string";

или

const char* str = "Test string";
printf(str);
4 голосов
/ 21 декабря 2010

Почему бы просто не использовать приведение типов?

(char*) "test"
2 голосов
/ 15 июля 2014

Делать типизацию от константной строки до указателя на символ, т.е.

char *s = (char *) "constant string";
1 голос
/ 21 декабря 2017

В C ++, заменить:

char *str = "hello";

с:

std::string str ("hello");

А если вы хотите сравнить:

str.compare("HALLO");
1 голос
/ 08 марта 2018

Я не понимаю, как применить ваше решение :( - kalmanIsAGameChanger

Работая с Arduino Sketch, у меня была функция, вызывающая мои предупреждения.

Оригинальная функция: char StrContains (char * str, char * sfind)

Чтобы прекратить предупреждения, я добавил const перед char * str и char * sfind.

Изменено: char StrContains (const char * str, const char * sfind).

Все предупреждения ушли.

0 голосов
/ 05 марта 2016

Спасибо всем за помощь. Выбор здесь и там приходит это решение. Это компилируется чисто. Еще не проверяли код. Завтра ... может быть ...

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 }

Я знаю, что в массиве timeServer есть только 1 элемент. Но могло быть и больше. Остальные были закомментированы на данный момент для экономии памяти.

0 голосов
/ 25 июля 2013

Ответ BlackShift очень полезен, и я использовал его так:

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 голосов
/ 08 июня 2012

просто используйте опцию -w для g ++

пример:

g ++ -w -o simple.o simple.cpp -lpthread

Помните, что это не предотвращает устаревание, а предотвращает вывод предупреждающего сообщения на терминал.

Теперь, если вы действительно хотите избежать устаревания, используйте ключевое слово const, например:

const char* s="constant string";  
0 голосов
/ 14 мая 2012
PyTypeObject PyDict_Type=
{ ...

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

смотреть поле имени, в gcc оно компилируется без предупреждения, но в g ++ это будет, я не знаю почему.

in gcc (Compiling C), -Wno-write-strings активен по умолчанию.

in g++ (Compiling C++) -Wwrite-strings активен по умолчанию

Вот почему существует другое поведение. Для нас использование макросов Boost_python генерирует такие предупреждения. Поэтому мы используем -Wno-write-strings при компиляции C ++, так как мы всегда используем -Werror

0 голосов
/ 26 октября 2008

Почему вы не используете опцию -Wno-deprecated, чтобы игнорировать устаревшие предупреждающие сообщения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...