如何在另一个定义中的目标c中使用定义

时间:2019-06-29 01:57:00

标签: objective-c

我需要在另一个定义内使用define,以便仅在一个位置进行替换就可以简化代码。 问题(目标C代码)

#define URL @"www.example.com/"
#define UserLogin @"<Login xmlns=\"http://www.example.com/\"><Email>%@</Email><Password>%@</Password></Login>" 
.
.
.
#define UserRegistration @"<Reg xmlns=\"http://www.example.com/\"><Email>%@</Email></Reg>" 

我有一个这样的语句列表,可以在xmlns = \“ ... / \”处使用URL吗? 我可以使用上面定义的URL,例如xmlns = \“ URL / \” 所以我只能在一个地方替换url。

2 个答案:

答案 0 :(得分:0)

您可以通过以下方式-

#define URL @"www.example.com/"
#define UrlWithUrl [NSString stringWithFormat:@"<Login xmlns=\"http://%@/\">",URL] 

答案 1 :(得分:0)

#define令牌将在随后的#define 提供中扩展,它不在字符串中–在您的情况下,您希望在{字符串,因此仅写入字符串不会导致其被扩展。

但是,在(Objective-)C中,编译器会自动将相邻的字符串文字串联起来,成为单个字符串文字,例如:

URL

由编译器转换为:

@"one " @"two"

知道您可以将@"one two" 的定义重写为三个字符串,编译器将它们合并为一个字符串:

UserLogin

,并且在代码中使用#define UserLogin @"<Login xmlns=\"" URL @"\"><Email>%@</Email><Password>%@</Password></Login>" 的情况将由三个字符串代替,然后由编译器将它们连接在一起,例如

UserLogin

在预处理后出现:

NSLog("%@", UserLogin);

,然后连接相邻的字符串文字:

NSLog("%@", @"<Login xmlns=\"" @"www.example.com/" @"\"><Email>%@</Email><Password>%@</Password></Login>");

对于更复杂的情况,您需要阅读preprocessor,尤其是stringification

在Xcode中,您可以通过选择菜单项NSLog("%@", @"<Login xmlns=\"www.example.com/\"><Email>%@</Email><Password>%@</Password></Login>"); 来查看宏的结果,这将打开一个窗口,显示所有宏都展开后的源文件,即编译器将编译的结果源代码。

HTH