Переменные 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