Конвертировать синтаксис C ++ в цель C - PullRequest
1 голос
/ 17 июня 2011

Мой опыт работы с C / C ++ / C #.

Я использую библиотеку C ++ в проекте xcode (точнее, библиотека - PJSIP).Чтобы использовать библиотеку, мне нужно привязать пару обратных вызовов к моему коду, например:

SipTest.m

#include < pjsua-lib/pjsua.h >

static void on_reg_state(pjsua_acc_id acc_id)
{
    // Do work
} 

static void Init()
{
   // pjsua_config and psjua_config_default are  defined in the header file from pjsip
    pjsua_config cfg;            
    psjua_config_default(&cfg);  

    cfg.cb.on_regstate = &on_reg_state;
 }

Я хочу переключить этот синтаксис C ++ на Objective C

так я и сделал:

 +(void) on_reg_state:(pjsua_acc_id) acc_id
 {
    // Do work
 } 

 +(void) Init
 {
    pjsua_config cfg;            
    psjua_config_default(&cfg);  

    cfg.cb.on_regstate = &on_reg_state; // ***** this is causing compile error
                                        // I tried [CLASS NAME on_reg_state] and i get   runtime error
 }

Я попытался найти делегата в Objective C, но я не смог найти подобный случай, когда обратный вызов уже реализован в C ++, и вы хотите использовать его сСинтаксис Objective-C.

Спасибо

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

Прежде всего, совершенно не нужно ничего конвертировать.Совершенно нормально вызывать библиотеки C ++ из Objective-C.

Во-вторых, причиной ошибки компилятора является то, что вы пытаетесь вставить метод в место, где должен быть указатель на функцию.Вы не можете сделать указатель на функцию из метода Objective C с помощью оператора &.Просто сохраните свою on_reg_state() функцию и используйте ее, как вы делали раньше, так вы делаете обратные вызовы и в средах Apple на основе C (которые понадобятся вам, как только вы выйдете за пределы того, что предоставляют высокоуровневые API Objective-C)).

И в-третьих, ваш метод + (void)Init кажется немного странным.Я настоятельно рекомендую вам написать метод с именем Init (с заглавной буквы).Если вы намереваетесь написать инициализатор, он должен быть - (id)init, то есть в нижнем регистре и возвращать id.И не забудьте вызвать назначенный инициализатор его суперкласса, проверить его возвращаемое значение, присвоить его себе и вернуть в конце метода init (см. Реализация инициализатора в Документация Apple , если вы не знакомы с этим).И если ваш метод не является инициализатором, используйте другое имя, например - (void)createConfig.

0 голосов
/ 17 июня 2011

в этом случае вы хотите использовать селекторы.

+(void) on_reg_state:(pjsua_acc_id) acc_id
 {
    // Do work
 } 

 +(void) Init
 {
    pjsua_config cfg;            
    psjua_config_default(&cfg);  

    cfg.cb.on_regstate_selector = @selector(on_reg_state:);
    cfg.cb.target = self; //Self here is the class object in your 'Init' method, which is poorly named.
    //Use this like [cfg.cb.target performSelector:cfg.cb.on_regstate_selector withObject:...etc]

 }
...