/ / NSString (або NSArray або щось) до списку змінних параметрів рядків C (char *) - об'єктив-c, c, список, змінні, параметри

NSString (або NSArray або щось) до списку змінних параметрів рядків C (char *) - об'єктив-c, c, список, змінні, параметри

Чи є простий спосіб перетворення класу Objective-C у NSStrings в параметри для функції, яка приймає перемінний список char *? Зокрема, у мене є така функція, як:

- (недійсний) someFunction: (NSSomething *) var

що я хочу направити на функцію C, як

void someCFunction (char * var, ...)

Чи є простий спосіб це зробити?

Відповіді:

1 для відповіді № 1

Ні, ви можете робити те, що хочете, лише якщо кількість комбінаційних аргументів відома під час компіляції. Якщо ви просто хочете конвертувати один рядок, скористайтеся -UTF8String повідомлення:

// Example with two strings
NSString *str1 = ...;
NSString *str2 = ...;
someCFunction([str1 UTF8String], [str2 UTF8String]);  // etc.

Але якщо кількість рядків буде коливатися вНаприклад, якщо існує API, який прийняв масив рядків, ви можете перетворити масив Objective-C у масив C:

// This function takes a variable number of strings.  Note: in C/Objective-C
// (but not in C++/Objective-C++), it"s not legal to convert "char **" to
// "char *const *", so you may sometimes need a cast to call this function
void someCFunction(const char *const *stringArray, int numStrings)
{
...
}

...

// Convert Objective-C array to C array
NSArray *objCArray = ...;

int numStrings = [objCArray count];
char **cStrArray = malloc(numStrings * sizeof(char*));
for (int i = 0; i < count; i++)
cStrArray[i] = [[objCArray objectAtIndex:i] UTF8String];

// Call the function; see comment above for note on cast
someCFunction((const char *const *)cStrArray, numStrings);

// Don"t leak memory
free(cStrArray);

0 для відповіді № 2

Це зробить трюк:

NSString *string = @"testing string"
const char * p1=[string UTF8String];
char * p2;
p2 = const_cast<char *>(p1);

0 для відповіді № 3

Так, це можна зробити, і тут пояснюється:

Як створити NSString з рядка форматування, як @ "xxx =% @, yyy =% @" та NSArray об'єктів?

І тут:

http://www.cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html

З модифікаціями для ARC тут:

Як створити NSString з рядка форматування, як @ "xxx =% @, yyy =% @" та NSArray об'єктів?

Також, змінні аргументи не статично абосильно надрукований, як здається іншим плакатом. Фактично, немає чіткого вказівки на виклик кількості аргументів, які ви дійсно маєте. Визначаючи кількість аргументів, як правило, розбивається на те, що необхідно вказати номер за параметром count, використовуючи нульовий термінатор, або виводячи його з рядка формату a la (s) print *. Це, чесно кажучи, чому сімейство функцій C (s) print * було джерелом багатьох помилок, тепер це робиться набагато безпечнішим завдяки XCode / Clang / GCC, який зараз попереджає.

Як сторону, ви можете наблизитися до статичного друкузмінні аргументи в C ++, створивши метод шаблону, який приймає масив невизначеного розміру. Як правило, це вважається поганою формою, хоча, оскільки компілятор створює окремі екземпляри для кожного розміру масиву, видимих ​​компілятором (розрив шаблону).