NSStrings のクラスを保持する Objective-C を、char * の変数リストを受け入れる関数のパラメーターに変換する簡単な方法はありますか? 具体的には、次のような機能があります。
-(void)someFunction:(NSSomething *) 変数
次のようなC関数に転送したい
void someCFunction(char * var, ...)
これについて簡単な方法はありますか?
NSStrings のクラスを保持する Objective-C を、char * の変数リストを受け入れる関数のパラメーターに変換する簡単な方法はありますか? 具体的には、次のような機能があります。
-(void)someFunction:(NSSomething *) 変数
次のような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);
はい、これは実行できます。ここで説明します。
@"xxx=%@, yyy=%@" のようなフォーマット文字列とオブジェクトの NSArray から NSString を作成する方法は?
そしてここ:
http://www.cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html
ここでARCの変更を行います:
@"xxx=%@, yyy=%@" のようなフォーマット文字列とオブジェクトの NSArray から NSString を作成する方法は?
また、他のポスターが示唆しているように、可変引数は静的または強く型付けされていません。実際、呼び出し先には、実際にいくつの引数があるかを明確に示すものはありません。引数の数を決定することは、通常、null ターミネータを使用して count パラメーターで数を指定するか、または la (s)print* の形式文字列から推測する必要があることに分解されます。これが率直に言って、C (s)print* ファミリーの関数が多くのエラーの原因となっており、現在は警告を発する XCode / Clang / GCC コンパイラーによってはるかに安全になっています。
余談ですが、サイズが指定されていない配列を受け入れるテンプレート メソッドを作成することで、C++ で静的に型指定された変数引数にアプローチできます。これは、コンパイラが認識した配列のサイズごとに個別のインスタンスを生成するため (テンプレートの肥大化)、一般的に悪い形式と見なされます。
これはトリックを行います:
NSString *string = @"testing string"
const char * p1=[string UTF8String];
char * p2;
p2 = const_cast<char *>(p1);