Objective-C变量在C ++中读取为null

x6herbius

我正在写一个跨平台的应用程序,需要跨通过argc,并argv从在Xcode的Objective-C在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 ++部分后,我尝试读取这些全局变量,以将它们传递给pure-C ++类:

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

当使用调试器逐句通过,cmdlArgccmdlArgv显示为有效数据,但argcargv仍在0和NULL的分配之后。我在这里做错了什么?

Trojanfoe

您不展示如何cmdlArgccmdlArgv声明; 它肯定在头文件中,但是看起来像什么?

main.m定义这些变量之后,没有其他人可以访问这些变量static,这使我想知道为什么您没有收到链接器错误。我的结论是的申报cmdlArgccmdArgv是这样的:

int cmdlArgc;
const char** cmdlArgv;

而不是这样:

extern int cmdlArgc;
extern const char** cmdlArgv;

因此,每个包含标头的实现文件都将获得自己的副本,这就是其0/的原因NULL

解决方案是删除staticin的使用main.m并开始extern在标头中使用。

然而,它仍然是一个丑陋的模式,我认为最好的解决办法是重命名main.mmain.mm并初始化CCommandLineArgsmain(),这是既干净又简单。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章