C2440: '=': невозможно преобразовать из 'const char [9]' в 'char *' - PullRequest
0 голосов
/ 09 января 2019

Я работаю над проектом Qt5, написанным на C ++. Сборка проекта выдает ошибку:

C2440: '=': невозможно преобразовать из 'const char [9]' в 'char *'

Который указывает на строку кода ниже:

port_name= "\\\\.\\COM4";//COM4-macine, COM4-11 Office

SerialPort arduino(port_name);
if (arduino.isConnected())
    qDebug()<< "ardunio connection established" << endl;
else
    qDebug()<< "ERROR in ardunio connection, check port name";
//the following codes are omitted ....

В чем здесь проблема, и как я могу ее исправить?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Строковые литералы являются постоянными данными в C ++ (компиляторы, как правило, хранят их в постоянной памяти, когда это возможно).

В C ++ 11 и более поздних версиях вы больше не можете назначать строковый литерал непосредственно для указатель на non-const-char (char*) 1 .

1: хотя некоторые компиляторы C ++ 11 могут разрешать его как нестандартное расширение для обратной совместимости, которое может потребоваться включить вручную через флаг компилятора.

Итак, вам нужно объявить port_name как указатель на const-char вместо (const char * или char const *). Но тогда вам придется привести его обратно к неконстантному char* при передаче его на SerialPort():

const char *port_name = "\\\\.\\COM4";
SerialPort arduino(const_cast<char*>(port_name));

Или просто:

SerialPort arduino(const_cast<char*>("\\\\.\\COM4"));

В качестве альтернативы можно объявить port_name как неконстантный char[] буфер, скопировать в него строковый литерал и затем передать его в SerialPort():

char port_name[] = "\\\\.\\COM4";
SerialPort arduino(port_name);
0 голосов
/ 09 января 2019

В C ++, в отличие от C, строковые литералы имеют значение const. Поэтому любой указатель на такой строковый литерал тоже должен быть const:

const char* port_name = "\\\\.\\COM4";  // OK
// char* port_name = "\\\\.\\COM4";  // Not OK
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...