Objective-C променливите се четат като null в C++

Пиша междуплатформено приложение и трябва да предам argc и argv от Objective-C в Xcode към моя общ клас манипулатор на аргументи в C++. Имам глобален указател към този клас манипулатор, който задавам с команда new, но тъй като не мога да направя new в Objective-C, опитвам следното:

Имам заглавен файл, наречен MacCommandLineArgs.h, който съдържа само следното:

static int cmdlArgc = 0;
static const char** cmdlArgv = NULL;

След това зададох тези от main.m:

int main(int argc, char *argv[])
{
    cmdlArgc = argc;
    cmdlArgv = (const char**)argv;
    return NSApplicationMain(argc, (const char **)argv);
}

След като влезете в секцията Objective-C++ на приложението, се опитвам да прочета обратно тези глобални променливи, за да ги предам на чистия C++ клас:

int argc = cmdlArgc;
const char** argv = cmdlArgv;
globalCommandLineArgs = new CCommandLineArgs(argc, argv);

Когато преминете през програмата за отстраняване на грешки, cmdlArgc и cmdlArgv се показват като валидни данни, но argc и argv все още са 0 и NULL след присвояването. Какво правя грешно тук?


person x6herbius    schedule 15.09.2015    source източник
comment
В един и същи файл ли ги четеш? Моля, дайте повече контекст на кода за четене.   -  person Amin Negm-Awad    schedule 15.09.2015


Отговори (1)


Не показвате как cmdlArgc и cmdlArgv са декларирани; със сигурност е в заглавен файл, но как изглежда?.

Нищо извън main.m няма да има достъп до тези променливи, тъй като те са дефинирани static, което ме кара да се чудя защо не получавате грешки при свързване. Заключих, че декларацията на cmdlArgc и cmdArgv е нещо подобно:

int cmdlArgc;
const char** cmdlArgv;

а не това:

extern int cmdlArgc;
extern const char** cmdlArgv;

Така че всеки файл за изпълнение, който включва заглавката, ще получи собствено копие, поради което е 0/NULL.

Решението е да се откажете от използването на static в main.m и да започнете да използвате extern в заглавката.

Въпреки това, това все още е грозен модел и мисля, че най-доброто решение е да преименувате main.m на main.mm и да инициализирате CCommandLineArgs в main(), което е едновременно чисто и просто.

person trojanfoe    schedule 15.09.2015
comment
Инициализирането на cmdlArgc и cmdlArgv също е декларацията. Въпреки това промених main.m на main.mm и това изглежда решава проблема. Благодаря! - person x6herbius; 15.09.2015