C++ comparison with string literal results in unspecified behavior, почему в QT нет ошибки
Здравтвуйте. Пожалуйста, объясните где я неправ. Уменя такой код:
char* Usr; Usr = getenv("USER"); if (Usr == "madmentat") {cout << "User madmentat detected" << endl;}
Вообще, я начал изучение программирования на Си++ с Qt и там это прокатывало, а вот в блокнотике ручками почему-то не выходит. При компиляции выдается следующая ошибка:
warning: comparison with string literal results in unspecified behavior [-Waddress]
Ответы (1 шт):
По русски: Такое сравнение даст непредвиденный результат. А точнее не даст результата вообще, т.к указатели на сторки (адреса, char* хранит адрес где находится текст, а не сам текст) - гарантировано не совпадут (хоть и совпадёт содержимое). Используйте strcmp (или lstrcmpA если хотите WINAPI).
Но есть несколько случаев когда так можно делать.
Если вы заранее присвоили в char* константное значение, и каждое значение привели к константному, либо работаете исключительно с константами - тогда так делать можно.
Например
const char* value1 = "value1";
const char* value2 = "value2";
char* a = (char*)value1; // Хоть и избавились от константы, менять текст нельзя
if (a == value1) { /*совпало*/};
Или если сделали приведение
bool checkUsr(char * user) {
if (strcmp(user,value1 )==0) user = (char*)value1;
if (strcmp(user,value2 )==0) user = (char*)value2;
if (user == value1) { /*сработает*/}
}
Правильно писать вот так
сhar* Usr; Usr = getenv("USER"); if (strcmp(Usr,"madmentat")
{cout << "User madmentat detected" << endl;}
Вообще, я начал изучение программирования на Си++ с Qt и там это прокатывало, а вот в блокнотике ручками почему-то не выходит. При компиляции выдается следующая ошибка
Конечно в QT можно, только не с char*, а с QString
QString Usr = getenv("USER");/* вызвали Конструктор */
if (Usr == "madmentat" /*вызов оператора*/) { /*сработает*/}
Потому что вызывается не сравнение указателей на строку, а оператор сравнения. Если вы хотите вне QT использовать что-то похожее, и в ваших либах нету подходящей - создайте класс, реализуйте и пользуйтесь. (Реализацию на QT можно подглянуть тут http://github.com/radekp/qt/blob/master/src/corelib/tools/qstring.cpp).
class MyStr {
char * str;
public:
MyStr() { str="";}
MyStr(const char * value) { str = (char*)value;} // конструктор
MyStr(char *value) { str = value;}// конструктор
bool operator == (const char *value2) { // Оператор
return (strcmp(str,value2)==0); // Упрощенно, без проверок на null
}
};
// Теперь вы можете делать как в QT
MyStr Usr = getenv("USER"); if (Usr == "madmentat") { /*всё ок*/}