/ / NSString (или NSArray или нещо подобно) към списъка с променливи параметри на струните C (char *) - обекти-c, c, списък, променливи, параметри

NSString (или NSArray или нещо подобно) към списък с променливи параметри на низовете C (char *) - цел-c, c, списък, променливи, параметри

Има ли лесен начин да преобразувате клас на обекти от тип C на NSStrings в параметри за функция, приемаща променлив списък с char *? По-конкретно имам функция като:

- (празно) someFunction: (NSSomething *) var

че искам да препраща към функция С като

void someCFunction (char * var, ...)

Има ли лесен начин да се направи това?

Отговори:

1 за отговор № 1

Не, можете да направите това, което искате, само ако броят на аргументите, които предавате, е известен при компилацията. Ако просто искате да конвертирате един низ, използвайте -UTF8String съобщение:

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

Но ако броят на струните ще вариратрябва да използвате различен приложния програмен интерфейс (API), ако има такъв.Например, ако има 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 на обекти?

Също така, променливите аргументи не са статични илисилно напечатани, както изглежда изглежда, че показва другият плакат. Всъщност, няма ясна индикация в избирателя колко аргументи наистина имате. Определянето на броя на аргументите обикновено се свежда до това, че трябва да посочим числото чрез параметър за броя, като използваме терминатор с нулева стойност или да го изведем от низ от формат a la (print) *. Това е честно защо фамилията от функции на C (s) print * е източник на много грешки, които вече са много по-безопасни от компилатора XCode / Clang / GCC, който сега предупреждава.

Като отстрани можете да се приближите статичнопроменливи аргументи в C ++ чрез създаване на шаблонен метод, който приема масив с неопределен размер. Това обикновено се счита за лоша форма, макар че компилаторът генерира отделни случаи за всеки размер на масива, видян от компилатора (шаблонът подути).