Я пишу кусок кода, который использует и C ++ и Objective C.
Мне нужно конвертировать NSString*
в char*
, [str UTF8string]
не будет работать, потому что он возвращается const char*
, Я знаю:
std::string
-> char*
: char* c = const_cast<char*>(pathStr.c_str());
NSString*
-> std::string
: ссылка на сайт
Но это выглядит слишком странно, и я до сих пор не могу это проверить. Могу ли я преобразовать его в лучшую сторону, например, NSString*
-> const char*
-> char*
Примени его к чарсу *
(char*)[str UTF8String];
Пока вы не хотите редактировать это … если вы это сделаете, то поместите его в какой-нибудь массив символов.
Я думаю, это зависит только от того, что вы хотите с этим делать.
Обратите внимание:
Возвращенная строка C является указателем на структуру внутри строки
объект, который может иметь время жизни короче, чем строковый объект и
конечно, не будет иметь более долгую жизнь. Поэтому вы должны скопировать
строка C, если она должна храниться вне контекста памяти в
который вы назвали этот метод.
Если вы планируете изменить строку или планируете использовать ее в течение длительного периода времени, выполните для нее соответствующую операцию копирования. Или использовать getCString:maxLength:encoding:
напрямую создать копию.
Если вы не планируете изменять строку, то теоретически нет необходимости приводить ее к неконстантным (хотя это правда, что многие интерфейсы требуют char*
Парм, когда они должны призвать const char*
, так что иногда приходится обманывать).
Мой C ++ немного ржавый, но вам нужно решить, является ли ваша строка ASCII или Unicode, а затем переходите оттуда. Например:
std::string foo = std::string( [str cStringUsingEncoding: NSASCIIStringEncoding] );
Если вам нужна строка в Юникоде, вам сначала нужно создать массив с нулевым символом в конце uint16_t и передать его конструктору:
NSUInteger len = [str length];
uint16_t str = calloc(len+1, sizeof(uint16_t);
for(int i=0; i<len; ++i) {
str[i] = [str characterAtIndex:i];
}
std::u16string foo = std::u16string( str );
Вышеупомянутое должно работать для большинства строк Unicode, но если ваши символы являются настоящими 32-битными, то вам нужно использовать ‘wstring, используя код, аналогичный второму примеру.
Скорее всего, вы видите предупреждение компилятора, например:
Initializing 'char *' with an expression of type 'const char *' discards qualifiers
Компилятор выдает это конкретное предупреждение, поскольку без квалификатора const указатель может быть разыменован, а затем изменен. Это не просто техническая составляющая, и на самом деле это осторожность, к которой следует относиться осторожно.
Проверьте этот другой ответ для получения дополнительной информации