我正在编写一个跨平台的应用程序,需要将<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
显示为有效数据,但cmdlArgv
和argc
在分配后仍为0和NULL。我在这里做错了什么?
答案 0 :(得分: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()
,这两者都是干净的简单。