const char * сравнение с ==

У меня есть функция, которая возвращает const char * в фиксированное значение, и когда я использую эту функцию, я использую оператор «==», чтобы найти равенство между возвращаемым значением и тем, которое я ожидаю. Это хорошая практика? Должен ли это быть анти-шаблон? Бывший:

const char * LOL = "LOL";  

const char * getI() {  
    return LOL;  
}

main {  
    if (getI() == LOL)  
        something();  
}  

person Fausto Carvalho Marques Silva    schedule 04.04.2011    source источник
comment
Дубликат stackoverflow.com/questions/2440420/   -  person user470379    schedule 05.04.2011
comment
Этот возможный дубликат касается того, как вы должны сравнивать содержимое строки. Вопрос может быть не об этом.   -  person nos    schedule 05.04.2011
comment
Каждый раз, когда я вижу LOL, я начинаю смеяться. Я должен быть ботаником.   -  person Marlon    schedule 05.04.2011


Ответы (5)


Это хорошая практика?

Ну, это зависит.

Это правильно делать тогда и только тогда, когда вы хотите проверить, указывает ли указатель, возвращаемый getl(), на тот же строковый литерал, что и глобальный указатель LOL. Если это не то, что вы хотите сделать, то нет, это не очень хорошая практика.

person James McNellis    schedule 04.04.2011

Это зависит от. Если вы пытаетесь обнаружить, что экземпляры строк одинаковы, это правильно. Если вы пытаетесь определить, совпадает ли содержимое строк, то это не так.

person Matthias Wandel    schedule 04.04.2011
comment
Содержимое одинаково, потому что это одна и та же глобальная константная переменная. Соглашаться? - person Fausto Carvalho Marques Silva; 05.04.2011
comment
В данном конкретном случае да, они одинаковые. Что нужно учитывать, так это то, хотите ли вы, чтобы if(getl() == "FOO") также сравнивалось как истинное, или если вы хотите, чтобы if(getl() == getx()) возвращало истинное значение, если getx() также возвращает произвольный указатель на строку LOL. - person nos; 05.04.2011

Как говорили другие, это зависит от того, что вы хотите сделать.

Когда вы говорите «ценность, которую я ожидаю», что вы имеете в виду? Чего ожидаете вы?

Не зная вашего ответа на это: в общем, плохая практика. Насколько мне известно, компиляторы могут повторно использовать расположение строк. Итак, это поведение:

const char *LOL = "lol";
const char *test = "lol";
return (test == LOL);

не является четко определенным.

person usul    schedule 04.04.2011

Ну... вы пытаетесь вернуть значение с глобальным именем, чтобы код был более читабельным, верно? (если я неправильно истолковал, игнорируйте: P). Рассуждение прекрасное, но это не тот путь.

Обычный способ сделать это #define:

#define MY_MEANINGFUL_RETURN 1

int doSomething() {
    return MY_MEANINGFUL_RETURN;
}

(...)
    if (doSomething() == MY_MEANINGFUL_RETURN)
(...)

Если бы вы использовали описанную выше технику const char*, вам пришлось бы сохранять эти строки в памяти во время выполнения, чтобы затем сравнивать только их позицию в памяти. При втором подходе компилятор управляет числами, и вы получаете красивые имена, не требуя дополнительного времени или места.

person slezica    schedule 04.04.2011
comment
Мне приходится работать с char *, поэтому я выбираю const char * перед строкой #define, потому что она будет создавать автоматическую переменную в каждом месте, где я на нее ссылаюсь, а const char * экономит место для меня. - person Fausto Carvalho Marques Silva; 05.04.2011
comment
Если вам нужно работать с char*, я ответил не на тот вопрос :) - person slezica; 05.04.2011

Идентичность объекта против равенства:

Если вы собираетесь использовать его как способ/конструкцию для «идентификации» объектов (в данном случае глобальный указатель LOL, который фактически является просто ТАКИМ ЖЕ объектом в вашей строке кода), то это безопасно.

Но при более глубоком рассмотрении вашего примера кажется, что вы действительно хотите проверить «равенство»: т.е. проверить, равны ли два объекта, т.е. содержат ли они одинаковое значение?

person Viren    schedule 05.04.2011