我正在写一个跨平台的应用程序,需要跨通过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);
当使用调试器逐句通过,cmdlArgc
并cmdlArgv
显示为有效数据,但argc
并argv
仍在0和NULL的分配之后。我在这里做错了什么?
您不展示如何cmdlArgc
和cmdlArgv
被声明; 它肯定在头文件中,但是看起来像什么?
main.m
定义这些变量之后,没有其他人可以访问这些变量static
,这使我想知道为什么您没有收到链接器错误。我的结论是的申报cmdlArgc
和cmdArgv
是这样的:
int cmdlArgc;
const char** cmdlArgv;
而不是这样:
extern int cmdlArgc;
extern const char** cmdlArgv;
因此,每个包含标头的实现文件都将获得自己的副本,这就是其0
/的原因NULL
。
解决方案是删除static
in的使用main.m
并开始extern
在标头中使用。
然而,它仍然是一个丑陋的模式,我认为最好的解决办法是重命名main.m
到main.mm
并初始化CCommandLineArgs
中main()
,这是既干净又简单。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句