Макросы C++: управление параметром (определенный пример)

Вы можете получить контроллер вида сверху, используя нижнее расширение:

extension UIApplication {
    class func getTopMostViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let nav = base as? UINavigationController {
            return getTopMostViewController(base: nav.visibleViewController)
        }
        if let tab = base as? UITabBarController {
            if let selected = tab.selectedViewController {
                return getTopMostViewController(base: selected)
            }
        }
        if let presented = base?.presentedViewController {
            return getTopMostViewController(base: presented)
        }
        return base
    }
 }

Используйте это расширение, чтобы получить самый верхний контроллер вида в стеке навигации, используя следующий код:

guard let topVC = UIApplication.getTopMostViewController() else {return}

Предустановите свой вид контроллер, использующий контроллер вида сверху:

DispatchQueue.main.async(execute: { () -> Void in
    topVC.present(incomingcallController, animated: true, completion: nil)
}
5
задан a3f 31 March 2015 в 01:37
поделиться

3 ответа

Как насчет:

#define UNSAFE_GET(X) String str_##X = getFunction(#X);

Или, чтобы обезопасить себя от проблем с вложенными макросами:

#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2(a, b) a##b
#define PASTE(a, b) PASTE2(a, b)

#define SAFE_GET(X) String PASTE(str_, X) = getFunction(STRINGIFY(X));

Использование:

SAFE_GET(foo)

И вот что скомпилировано:

String str_foo = getFunction("foo");

Ключевые моменты:

  • Используйте ## для объединения параметров макроса в один токен (token => имя переменной и т. Д.)
  • И # для строкового определения параметра макроса (очень полезно при выполнении «отражения» в C / C ++)
  • Используйте префикс для ваши макросы, так как все они находятся в одном «пространстве имен», и вы не хотите конфликтов с любым другим кодом. (Я выбрал MLV на основе вашего имени пользователя).
  • Макросы-обертки помогают, если вы вкладываете макросы, то есть вызываете MLV_GET из другого макроса с другими объединенными / строковыми параметрами (согласно комментарию ниже, спасибо!).
26
ответ дан 18 December 2019 в 05:44
поделиться

Один из подходов - не указывать имя при вызове макроса:

#include <stdio.h>

#define GET( name ) \
    int int##name = getFunction( #name );   \


int getFunction( char * name ) {
    printf( "name is %s\n", name );
    return 42;
}

int main() {
    GET( foobar );
}
2
ответ дан 18 December 2019 в 05:44
поделиться

Отвечая на ваш вопрос, нет, вы не можете "снять" кавычки в C ++. Но, как показывают другие ответы, вы можете «добавить их». Так как вы всегда будете работать со строковым литералом (верно?), Вы сможете переключиться на новый метод.

2
ответ дан 18 December 2019 в 05:44
поделиться