Мне нужна функция для возврата строки, доступ к которой будет доступен только для чтения. Содержимое строки известно во время компиляции, поэтому я в любом случае буду использовать строковый литерал.

Я могу вернуть что-то вроде std::string:

std::string myFunction()
{
   return "string";
}

Или верните const char*:

const char* myFunction()
{
   return "string";
}

Является ли вторая альтернатива безопасной и портативной в этом сценарии?

15
sharptooth 3 Мар 2010 в 16:38

3 ответа

Лучший ответ

Является ли вторая альтернатива безопасной и портативной в этом сценарии?

Да! Объем памяти для строковых литералов является статическим , и они сохраняются в течение всего времени существования приложения.

14
Prasoon Saurav 3 Мар 2010 в 19:34
1
Не могли бы вы предоставить ссылку для доказательства?
 – 
Jonathan Mee
20 Окт 2016 в 15:12

Да! Но остерегайтесь этой потенциальной проблемы:

char * myFunc() {
    return "Constant string?";
}

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

К счастью, g ++ выдает неприятное предупреждение даже в режиме по умолчанию. Я не знаю, выводит ли VC ++ предупреждение с такой же страстью.

10
Philip Potter 3 Мар 2010 в 17:00
@Philip: Я пробовал это в VS2008 и не получил предупреждения. Не знаю, есть ли за это предупреждение. Возможно, он есть, и он отключен по умолчанию, потому что большая часть предоставленных заголовков вызовет предупреждение ;-)
 – 
quamrana
3 Мар 2010 в 17:11

Да. (Это не отличается от хранения такого указателя в глобальной структуре данных).

3
AProgrammer 3 Мар 2010 в 16:39