Мне нужна функция для возврата строки, доступ к которой будет доступен только для чтения. Содержимое строки известно во время компиляции, поэтому я в любом случае буду использовать строковый литерал.
Я могу вернуть что-то вроде std::string
:
std::string myFunction()
{
return "string";
}
Или верните const char*
:
const char* myFunction()
{
return "string";
}
Является ли вторая альтернатива безопасной и портативной в этом сценарии?
3 ответа
Является ли вторая альтернатива безопасной и портативной в этом сценарии?
Да! Объем памяти для строковых литералов является статическим , и они сохраняются в течение всего времени существования приложения.
Да! Но остерегайтесь этой потенциальной проблемы:
char * myFunc() {
return "Constant string?";
}
Да, вы можете преобразовать строковый литерал в неконстантный char *
! Это позволит вам позже разрушить мир, пытаясь изменить содержимое этого char *
. Эта «функция» существует по причинам, связанным с наследием - строковые литералы старше, чем const, и изначально были определены как char *
в C.
К счастью, g ++ выдает неприятное предупреждение даже в режиме по умолчанию. Я не знаю, выводит ли VC ++ предупреждение с такой же страстью.
Да. (Это не отличается от хранения такого указателя в глобальной структуре данных).
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .