0

有没有什么简单的方法可以将Objective-C持有的NSStrings类转换为接受char *变量列表的函数的参数?具体来说,我有一个类似的功能:

-(void)someFunction:(NSSomething *) var

我想转发到一个 C 函数,比如

void someCFunction(char * var, ...)

有没有简单的方法来解决这个问题?

4

3 回答 3

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);
于 2012-05-08T02:42:25.230 回答
0

这可以解决问题:

NSString *string = @"testing string"
const char * p1=[string UTF8String];
char * p2;
p2 = const_cast<char *>(p1);
于 2012-05-08T02:35:48.873 回答
0

是的,这可以做到,并在此处解释:

如何从 @"xxx=%@, yyy=%@" 和对象的 NSArray 之类的格式字符串创建 NSString?

和这里:

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

在此处对 ARC 进行修改:

如何从 @"xxx=%@, yyy=%@" 和对象的 NSArray 之类的格式字符串创建 NSString?

此外,变量参数不是静态或强类型的,正如另一张海报似乎暗示的那样。事实上,被调用者并没有明确指出你真正有多少参数。确定参数的数量通常分解为必须通过计数参数指定数量,使用空终止符,或者从格式字符串 a la (s)print* 推断它。坦率地说,这就是为什么 C (s)print* 系列函数一直是许多错误的根源,现在 XCode / Clang / GCC 编译器现在发出警告,现在变得更加安全。

顺便说一句,您可以通过创建一个接受未指定大小的数组的模板方法来处理 C++ 中的静态类型变量参数。这通常被认为是错误的形式,因为编译器会为编译器看到的每个数组大小生成单独的实例(模板膨胀)。

于 2013-10-09T17:42:11.550 回答