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

时间:2015-09-15 09:42:17

标签: c++ objective-c objective-c++

我正在编写一个跨平台的应用程序,需要将<form> <input type=email> <input type=submit> </form> argc从Xcode中的Objective-C传递到我在C ++中的泛型参数处理程序类。我有一个指向此处理程序类的全局指针,我使用argv命令设置,但因为我无法在Objective-C中执行new,所以我尝试以下操作:

我有一个名为new的头文件,其中只包含以下内容:

MacCommandLineArgs.h

然后我从static int cmdlArgc = 0; static const char** cmdlArgv = NULL;

中设置这些内容
main.m

一旦输入了应用程序的Objective-C ++部分,我会尝试回读这些全局变量,以便将它们传递给pure-C ++类:

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

使用调试器时,int argc = cmdlArgc; const char** argv = cmdlArgv; globalCommandLineArgs = new CCommandLineArgs(argc, argv); cmdlArgc显示为有效数据,但cmdlArgvargc在分配后仍为0和NULL。我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您没有说明cmdlArgccmdlArgv 宣布的方式;它肯定在一个头文件中,但它看起来像什么?。

main.m之外的任何内容都无法访问这些变量,因为它们已被定义static,这让我想知道为什么你没有收到链接器错误。我的结论是cmdlArgccmdArgv的声明是这样的:

int cmdlArgc;
const char** cmdlArgv;

而不是:

extern int cmdlArgc;
extern const char** cmdlArgv;

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

解决方案是在static中放弃使用main.m并开始在标题中使用extern

然而,它仍然是一个丑陋的模式,我认为最好的解决方案是将main.m重命名为main.mm并在CCommandLineArgs中初始化main(),这两者都是干净的简单。