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,因此编译将失败. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |