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



我需要在另一个定义中使用定义来使代码仅在一个地方替换来使代码简单。问题(目标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。

您可以以以下方式 -

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

#define代币将在随后的 #define 提供中不在字符串中 - 在您的情况下,您希望在字符串中使用 URL在字符串中不会导致其扩展。

然而,在(客观(c相邻字符串文字中,编译器会自动串联成为单个字符串文字,例如:

@"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>");

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

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

对于更复杂的情况,您需要在预处理器上阅读,特别是弦乐

在xcode中,您可以通过选择菜单项Product:Perform Action:Preprocess "..."来查看宏的结果,这将打开一个窗口,显示所有宏已扩展后显示您的源文件,即,所得源代码编译器将编译。

hth

最新更新