Как использовать определение в цели c в другом определении - PullRequest
0 голосов
/ 29 июня 2019

Мне нужно использовать определение внутри другого определения, чтобы сделать код простым, заменяя только в одном месте.Проблема (код Objective 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>" 

У меня есть список таких утверждений, могу ли я использовать URL вместо xmlns = \ "... / \", могу ли я использовать указанный выше URL, напримерxmlns = \ "URL / \", поэтому я могу заменить URL только в одном месте.

Ответы [ 2 ]

0 голосов
/ 30 июня 2019
Токен

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 "...", это открывает окно, показывающее ваш исходный файл после того, как все макросы были развернуты, то есть результирующий исходный код, который скомпилирует компилятор.

НТН

0 голосов
/ 29 июня 2019

Вы можете следующим образом -

#define URL @"www.example.com/"
#define UrlWithUrl [NSString stringWithFormat:@"<Login xmlns=\"http://%@/\">",URL] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...