Какой использовать символ константы [] или станд. константы:: строка?

Который лучше для строковых литералов, стандартной строки или символьного массива?

Я означаю говорить для постоянных строк, говорить

const char name[] = "so"; //or to use 
const string name = "so";
5
задан Passionate programmer 20 January 2010 в 08:18
поделиться

4 ответа

Для строковых литералов и только для строковых констант, которые происходят из литералов, я бы использовал const Char [] . Основное преимущество std :: string заключается в том, что у него есть управление памятью бесплатно, но это не проблема со строчными литералами.

Это в любом случае, это фактический тип буквальной буквальной буквами, и он может быть напрямую используется в любом API, который требует либо старых струнных струн Null Clined Cline Cline Cline Cline C ++, либо строки C ++ (неявное преобразование). Вы также получаете реализацию времени компиляции, используя массив вместо указателя.

Теперь при определении функциональных интерфейсов и даже если постоянства намереваются пропущены, я бы предпочел STD :: String , а не const Char * , как в последнем Размер дела теряется, и, возможно, нужно будет пересчитать.

из моего собственного опыта. Я рос старого написания .C_STR () на каждом и каждый вызов библиотеке регистрации (которые использовали переменные аргументы) для литеральных строк с информацией / ошибками.

8
ответ дан 18 December 2019 в 14:46
поделиться

Что вы делаете с этим? Что ожидают ваши методы?

Const Char - легче в хранилище, но не имеет мощности STD :: string, или безопасность при использовании его. Однако, если у вас много API с C, это может быть более разумный выбор.

std :: string будет предпочтительным вариантом.

2
ответ дан 18 December 2019 в 14:46
поделиться

Вы должны использовать то, что для вас более подходит. Если никаких особых требований я не буду использовать std :: string , потому что она выполняет всю работу памяти.

Для строковых литералов я бы использовал Const Char * . Причина против Const Char [] заключается в том, что вы можете использовать const char * для инициализации другой константы. Проверьте следующий код:

const char str1[] = "str1";
const char* str11 = "str11";

const char str2[] = str1;    // <<< compile error
const char* str22 = str11;   // <<< OK

Строковые литералы имеют статический длительность хранения (согласно 2,13,4 / 2), поэтому указатель Const Char * будет действителен до завершения программы.

2
ответ дан 18 December 2019 в 14:46
поделиться

По сравнению с некоторыми материалами, которые я работал над ним, звучит довольно маленький. Тем не менее, есть еще один подход, который будет работать в сочетании с тем, что показано апепагнатом выше.

Ответ заключается в создании структуры, которая позволит вам вырезать разделы программы одновременно и преобразовывать их один за другим.

E.G. Вставьте файл адаптера базы данных «Layer», который обрабатывает все вызовы в базе данных, затем один за другим, удаляйте каждый, но SQL и замените его вызовом на слой DB. Старые вызовы все равно будут прямыми, пока новые звонки проходят через слой. В конце концов все звонки будут проходить через слой, и вы можете изменить бэкэнд БД.

Вы можете сделать то же самое с любым другим разделом кода, расширяя структуру «слой», чтобы покрыть эту функциональность.

Ключ для смещения его из VB6 в VB.Net (например) - использовать библиотеку взаимодействия - вот одна статья: http://support.microsoft.com/kb/817248

Другой, Гораздо позже мысль: получим MZ-Tools и используйте их инструмент анализа, чтобы найти избыточный код и избавиться от него. Мне удалось устранить что-то вроде пяти до десяти процентов кода в старом устаревшем продукте в моей компании.

-121--1555328-

Я склонен к пользу const std :: string в const Char * для строковых литералов. Поскольку прохождение строковых литералов в функции, принимающие const std :: string & , молча создает строку каждый раз, когда они называются вместо одного. Однако, если я в основном использую литерал с функциями, ожидая const Char * , я буду использовать это вместо этого.

Я склонен к пользу std :: string для API.

Конечно, если я использую Unicode I использую STD :: WSTRing и wchar_t .

1
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: