加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 代码不起作用,但等效代码有效

发布时间:2020-12-16 09:41:33 所属栏目:百科 来源:网络整理
导读:#define CLog( s,... ) NSLog( @"%@",[NSString stringWithFormat:(s),##__VA_ARGS__] )#define PO(x) CLog(@#x ": %@",x) 然后我做: NSString * hello =[NSString stringWithFormat:@"%@,%@",theCatalogData.id,@(theCatalogData.images.count)]; PO(hello
#define CLog( s,... ) NSLog( @"%@",[NSString stringWithFormat:(s),##__VA_ARGS__] )
#define PO(x) CLog(@#x ": %@",x)

然后我做:

NSString * hello =[NSString stringWithFormat:@"%@,%@",theCatalogData.id,@(theCatalogData.images.count)];
    PO(hello);

作品

当然,缩短版本只是:

PO([NSString stringWithFormat:@"%@,@(theCatalogData.images.count)]);

这不起作用.我想知道为什么.

没有紧急情况没问题.无论如何,等效的时间更长.我只是想了解编译器如何解析宏以查看为什么事情不起作用.

解决方法

由于预处理器本身并不真正理解语法,因此包含逗号的宏参数将导致问题.

在第二种情况下,由于参数在引号之外包含两个逗号,编译器认为宏获取3个参数而不是一个,并且由于宏只接受一个参数,编译器会抱怨.

与您的第二个案例类似的简化测试案例;

#define TEST(a,b,c) a
TEST([d e:@"%@,f,g])

将扩大到;

[d e:@"%@,%@"

这表明a参数仅包含第一个未引用逗号的所有字符.

在您的情况下,您将TEST宏定义为采用一个参数,并且由于预处理器将其视为3,因此编译将失败.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读