const char * сравнение с == - PullRequest
1 голос
/ 05 апреля 2011

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

const char * LOL = "LOL";  

const char * getI() {  
    return LOL;  
}

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

Ответы [ 5 ]

6 голосов
/ 05 апреля 2011

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

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

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

3 голосов
/ 05 апреля 2011

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

2 голосов
/ 05 апреля 2011

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

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

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

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

не четко определено.

1 голос
/ 05 апреля 2011

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

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

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

1 голос
/ 05 апреля 2011

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

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

#define MY_MEANINGFUL_RETURN 1

int doSomething() {
    return MY_MEANINGFUL_RETURN;
}

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

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

...