目标C - #define使用__VA_ARGS__

时间:2014-01-22 13:17:42

标签: ios objective-c c-preprocessor variadic-macros variadic-functions

我正在学习如何使用宏,但现在却与之相混淆。

我正在尝试创建一个NSString连接,它只会将每个参数相互附加。

例如:concatOP(@"hey",@"Jude",@"Don't")会返回NSString,其中包含:@"heyJudeDon't"

我实际上制作了一些代码(这里也有一些代码)可以获得params的数量,但是我没有成功完成工作的第二部分。

#define NUMARGS(...)        ( sizeof((int[]){__VA_ARGS__}) / sizeof(int) )
#define concatOP(...)       NSMutableString *format = [[NSMutableString alloc] init];\
                            for( int i = 0; i < NUMARGS(__VA_ARGS__); i++){\
                            [format appendString:@"%@"];}\
                            [[NSString alloc] initWithFormat:format, __VA_ARGS__]

我实际上遇到了很多错误,告诉我格式不存在或者我错过了一些“;”或其他结束标签。

3 个答案:

答案 0 :(得分:7)

这是你的宏:

#define concatOP(...) [@[__VA_ARGS__] componentsJoinedByString:@""]

编辑: 如果你放松你的宏NSString* result = concatOP(@"hey",@"Jude",@"Don't"); 你会得到:

NSString* result = NSMutableString *format = [[NSMutableString alloc] init]; for( int i = 0; i < NUMARGS(@"hey",@"Jude",@"Don't"); i++){ format = [format appendString:@"%@"];} [[NSString alloc] initWithFormat:format, @"hey",@"Jude",@"Don't"];

看起来很奇怪。

答案 1 :(得分:3)

这并不能完全回答你的问题,但NSString文字是由编译器连接起来的,就像它们的C对应物一样,所以这段代码开箱即用:

NSString *str = @"Hey" @"Jude" @"Don't";

与:

相同
NSString *str = @"HeyJudeDon't";

这通常用于在源文件的多行中拆分长字符串文字。

底线;你不需要所有那些凌乱的宏和无意义的方法来做到这一点。

答案 2 :(得分:0)

我不知道如何用宏来做这件事。

你可以在Objective C中这样做:

实施类似的方法:

- (NSString *)concateStrings:(NSString *)firstArg, ...
{
    NSMutableString *concatString = [[NSMutableString alloc] init];
    va_list args;
    va_start(args, firstArg);
    for (NSString *arg = firstArg; arg != nil; arg = va_arg(args, NSString*))
    {
        [concatString appendString:arg];
    }
    va_end(args);

    return concatString;
}

您可以将此方法称为:

NSLog(@"%@",[self concateStrings:@"hey",@"Jude",@"Don't",nil]) ;

输出:

heyJudeDon't

确保最后通过nil