gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:38:47 24 4
gpt4 key购买 nike

我正在编写跨平台应用程序,需要将 Xcode 中的 Objective-C 中的 argcargv 传递到 C++ 中的通用参数处理程序类。我有一个指向这个处理程序类的全局指针,我用 new 命令设置了它,但是因为我不能在 Objective-C 中执行 new 我正在尝试以下操作:

我有一个名为 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);

当使用调试器单步执行时,cmdlArgccmdlArgv 显示为有效数据,但 argcargv赋值后仍然是 0 和 NULL。我在这里做错了什么?

最佳答案

您没有说明 cmdlArgccmdlArgv 是如何声明的;它肯定在头文件中,但它看起来像什么?

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

int cmdlArgc;
const char** cmdlArgv;

而不是这个:

extern int cmdlArgc;
extern const char** cmdlArgv;

因此每个包含 header 的实现文件都将获得自己的拷贝,这就是为什么它是 0/NULL

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

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

关于c++ - Objective-C 变量在 C++ 中读取为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32582760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com