【问题标题】:Objective-C variables read as null in C++Objective-C 变量在 C++ 中读取为 null
【发布时间】:2015-09-15 09:42:17
【问题描述】:

我正在编写一个跨平台应用程序,需要将 argcargv 从 Xcode 中的 Objective-C 传递到我在 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。我在这里做错了什么?

【问题讨论】:

  • 您是否在同一个文件中阅读它们?请为阅读代码提供更多上下文。

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


【解决方案1】:

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

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

int cmdlArgc;
const char** cmdlArgv;

而不是这样:

extern int cmdlArgc;
extern const char** cmdlArgv;

所以每个包含头文件的实现文件都会有自己的副本,这就是为什么它是0/NULL

解决方案是在main.m 中删除static 的使用,并在标题中开始使用extern

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

【讨论】:

  • cmdlArgccmdlArgv 的初始化也是声明。但是,我确实将 main.m 更改为 main.mm,这似乎解决了它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多