Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 目标C-#使用参数定义___Ios_Objective C_C Preprocessor_Variadic Macros_Variadic Functions - Fatal编程技术网

Ios 目标C-#使用参数定义__

Ios 目标C-#使用参数定义__,ios,objective-c,c-preprocessor,variadic-macros,variadic-functions,Ios,Objective C,C Preprocessor,Variadic Macros,Variadic Functions,我正在学习如何使用宏,但现在被一个宏弄糊涂了 我正在尝试创建一个NSString串联,它只会将每个参数相互附加 例如:concatOP(@“hey”、@“Jude”、@“Don't”)将返回一个NSString,其中包含:@“heyJudeDon't” 实际上,我编写了一段代码(这里也有一些代码)来获取参数的数量,但是我没有成功地完成工作的第二部分 #define NUMARGS(...) ( sizeof((int[]){__VA_ARGS__}) / sizeof(int) )

我正在学习如何使用宏,但现在被一个宏弄糊涂了

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

例如:
concatOP(@“hey”、@“Jude”、@“Don't”)
将返回一个
NSString
,其中包含:
@“heyJudeDon't”

实际上,我编写了一段代码(这里也有一些代码)来获取参数的数量,但是我没有成功地完成工作的第二部分

#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__]
#定义NUMARGS(…)(sizeof((int[]){uuu VA_ARGS_uu})/sizeof(int))
#定义concatOP(…)NSMutableString*格式=[[NSMutableString alloc]init]\
对于(int i=0;i

事实上,我收到了很多错误,告诉我格式不存在,或者我遗漏了一些“;”或其他结束标记。

我不知道如何使用宏

您可以在目标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]) ;
您可以像这样调用此方法:

- (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

我不知道如何处理宏

您可以在目标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]) ;
您可以像这样调用此方法:

- (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

这是您的宏:

#define concatOP(...) [@[__VA_ARGS__] componentsJoinedByString:@""]
编辑: 如果您解开宏
NSString*result=concatOP(@“嘿”,“裘德”,“不要”)
您将获得:

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"];
NSString*result=NSMutableString*format=[[NSMutableString alloc]init];对于(inti=0;i
看起来很奇怪。

这是你的宏:

#define concatOP(...) [@[__VA_ARGS__] componentsJoinedByString:@""]
编辑: 如果您解开宏
NSString*result=concatOP(@“嘿”,“裘德”,“不要”)
您将获得:

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"];
NSString*result=NSMutableString*format=[[NSMutableString alloc]init];对于(inti=0;i

看起来很奇怪。

这并不能完全回答您的问题,但是
NSString
文本是由编译器连接起来的,就像它们的C对应项一样,因此此代码是开箱即用的:

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

NSString *str = @"HeyJudeDon't";
这通常用于跨源文件的多行拆分长字符串文字


底线;您不需要所有这些凌乱的宏和无意义的方法来完成此操作。

这并不能完全回答您的问题,但是
NSString
文本由编译器连接,就像它们的C对应项一样,因此此代码是开箱即用的:

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

NSString *str = @"HeyJudeDon't";
这通常用于跨源文件的多行拆分长字符串文字


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

我不知道这是一个任意的例子还是你试图解决的真正问题,但人们通常使用
NSArray
method
componentsjoinedbythring
进行这种连接。所以
NSString*result=[@[@“嘿”,“裘德”,“不要”]组件通过字符串连接:@”“。我为什么得到-1?:/它可能会被否决,因为提议的宏遇到了这样一些根本性的问题(正如Cy-4AH的扩展所说明的,虽然您的意图很清楚,但提议的执行没有任何意义),即使是这样,我也不确定这是否是宏的一个很好的应用。尽管如此,我不确定它是否值得否决(这让我在变量宏中钻研,所以我学到了一些东西)。这个网站的目的是帮助人们,所以这个问题对一些人来说似乎很容易,但当我们遇到一些关于变量和预处理器指令的问题时,它并不明显。。。很抱歉不知道所有事情这是我最大的错误:/我仍然认为我的问题仍然值得,因为我学到了一些东西,我相信我不是唯一一个。这不适合你。对不起;)感谢您的解释:)我不知道这是一个武断的例子还是您试图解决的实际问题,但人们通常使用
NSArray
方法
组件通过字符串连接来实现这种连接。所以
NSString*result=[@[@“嘿”,“裘德”,“不要”]组件通过字符串连接:@”“。我为什么得到-1?:/它可能会被否决,因为提议的宏遇到了这样一些根本性的问题(正如Cy-4AH的扩展所说明的,虽然您的意图很清楚,但提议的执行没有任何意义),即使是这样,我也不确定这是否是宏的一个很好的应用。尽管如此,我不确定它是否值得否决(这让我在变量宏中钻研,所以我学到了一些东西)。这个网站的目的是帮助人们,所以这个问题对一些人来说似乎很容易,但当我们遇到一些关于变量和预处理器指令的问题时,它并不明显。。。很抱歉不知道所有事情这是我最大的错误:/我仍然认为我的问题仍然值得,因为我学到了一些东西,我相信我不是唯一一个。这不适合你。对不起;)感谢您的解释:)这实际上很有魅力,但我仍然不明白为什么我的代码不起作用(即使您的方法更简单,所以更好)。你知道吗?@CladClad你在宏中找不到
\uu VA\u ARGS\uu
s个参数。看这个:NUMARGS的工作是为了找到我尝试过的参数的数量;)它实际上来自你刚刚发表的帖子;)我的错误在于
格式=
这是一个旧的测试。事实上我只是想得到