有没有什么简单的方法可以将Objective-C持有的NSStrings类转换为接受char *变量列表的函数的参数?具体来说,我有一个类似的功能:
-(void)someFunction:(NSSomething *) var
我想转发到一个 C 函数,比如
void someCFunction(char * var, ...)
有没有简单的方法来解决这个问题?
有没有什么简单的方法可以将Objective-C持有的NSStrings类转换为接受char *变量列表的函数的参数?具体来说,我有一个类似的功能:
-(void)someFunction:(NSSomething *) var
我想转发到一个 C 函数,比如
void someCFunction(char * var, ...)
有没有简单的方法来解决这个问题?
不,只有在编译时知道您传递的参数数量时,您才能做您想做的事。如果您只想转换单个字符串,请使用-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);
这可以解决问题:
NSString *string = @"testing string"
const char * p1=[string UTF8String];
char * p2;
p2 = const_cast<char *>(p1);
是的,这可以做到,并在此处解释:
如何从 @"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++ 中的静态类型变量参数。这通常被认为是错误的形式,因为编译器会为编译器看到的每个数组大小生成单独的实例(模板膨胀)。