Objective-C中如何在#define中嵌套使用另一个#define以简化代码?
当然可以实现!这正是预处理器宏的优势之一
你只需要调整一下宏的定义方式,利用Objective-C字符串字面量的拼接特性(相邻的字符串字面量会自动合并),就能实现一处修改同步所有相关宏的效果。下面分两种情况给你解决方案:
方案一:直接调整现有URL宏的定义
如果你的URL宏其实应该包含http://前缀(毕竟xmlns里用到了完整的HTTP地址),可以直接修改它的定义,然后在其他宏里嵌套引用:
// 把URL宏改成不带外层引号和@符号的纯字符串内容 #define BASE_URL http://www.example.com/ // 在各个XML宏里通过字符串化操作符引用它 #define UserLogin @"<Login xmlns=\"" #BASE_URL "\"><Email>%@</Email><Password>%@</Password></Login>" #define UserRegistration @"<Reg xmlns=\"" #BASE_URL "\"><Email>%@</Email></Reg>"
这里的#BASE_URL是预处理器的字符串化操作符,它会把BASE_URL的内容转换成带双引号的字符串字面量,和前后的部分拼接后就得到正确的xmlns属性值。
方案二:保留原有URL宏的同时新增基础字符串宏
如果你想保留原来的URL宏(比如其他地方还在直接使用@"www.example.com/"),可以新增一个不带任何引号和@符号的基础字符串宏,然后让URL和所有XML宏都依赖它:
// 新增一个纯字符串内容的基础宏 #define BASE_URL_STRING www.example.com/ // 原来的URL宏基于这个基础宏定义 #define URL @#BASE_URL_STRING // XML宏里嵌套引用时补上http://前缀 #define UserLogin @"<Login xmlns=\"http://" #BASE_URL_STRING "\"><Email>%@</Email><Password>%@</Password></Login>" #define UserRegistration @"<Reg xmlns=\"http://" #BASE_URL_STRING "\"><Email>%@</Email></Reg>"
为什么这样可行?
Objective-C的预处理器会先处理所有宏替换,然后把相邻的字符串字面量自动合并。比如上面的UserLogin宏,替换后会变成:
@"<Login xmlns=\"" "http://www.example.com/" "\"><Email>%@</Email><Password>%@</Password></Login>"
编译器会自动把这三个相邻的字符串合并成一个完整的字符串,完全符合你原来的需求。以后只要修改BASE_URL或者BASE_URL_STRING的内容,所有用到它的宏都会自动同步更新。
内容的提问来源于stack exchange,提问作者Venkat
相关产品推荐
相关产品推荐

