Токен
A #define
будет расширен в последующем #define
при условии, что не в строке - в вашем случае вы хотите использовать URL
в строке, поэтому просто пишите в строке не приведет к его расширению.
Однако в (Objective-) C смежные строковые литералы автоматически объединяются компилятором, чтобы стать одностроковым литералом, например ::100100
@"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>");
В более сложных случаях вам необходимо прочитать препроцессор , в частности stringification
В Xcode вы можете увидеть результаты ваших макросов, выбрав пункт меню Product:Perform Action:Preprocess "..."
, это открывает окно, показывающее ваш исходный файл после того, как все макросы были развернуты, то есть результирующий исходный код, который скомпилирует компилятор.
НТН