Который лучше для строковых литералов, стандартной строки или символьного массива?
Я означаю говорить для постоянных строк, говорить
const char name[] = "so"; //or to use
const string name = "so";
Для строковых литералов и только для строковых констант, которые происходят из литералов, я бы использовал const Char []
. Основное преимущество std :: string
заключается в том, что у него есть управление памятью бесплатно, но это не проблема со строчными литералами.
Это в любом случае, это фактический тип буквальной буквальной буквами, и он может быть напрямую используется в любом API, который требует либо старых струнных струн Null Clined Cline Cline Cline Cline C ++, либо строки C ++ (неявное преобразование). Вы также получаете реализацию времени компиляции, используя массив вместо указателя.
Теперь при определении функциональных интерфейсов и даже если постоянства намереваются пропущены, я бы предпочел STD :: String
, а не const Char *
, как в последнем Размер дела теряется, и, возможно, нужно будет пересчитать.
из моего собственного опыта. Я рос старого написания .C_STR ()
на каждом и каждый вызов библиотеке регистрации (которые использовали переменные аргументы) для литеральных строк с информацией / ошибками.
Что вы делаете с этим? Что ожидают ваши методы?
Const Char - легче в хранилище, но не имеет мощности STD :: string, или безопасность при использовании его. Однако, если у вас много API с C, это может быть более разумный выбор.
std :: string будет предпочтительным вариантом.
Вы должны использовать то, что для вас более подходит. Если никаких особых требований я не буду использовать 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 *
будет действителен до завершения программы.
По сравнению с некоторыми материалами, которые я работал над ним, звучит довольно маленький. Тем не менее, есть еще один подход, который будет работать в сочетании с тем, что показано апепагнатом выше.
Ответ заключается в создании структуры, которая позволит вам вырезать разделы программы одновременно и преобразовывать их один за другим.
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
.