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

Objective-C variables read as null in C++

我正在编写一个跨平台应用程序,需要将 argcargv 从 Xcode 中的 Objective-C 传递到我的通用参数处理程序 class 在 C++ 中。我有一个指向此处理程序 class 的全局指针,我用 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++ class:

int argc = cmdlArgc;
const char** argv = cmdlArgv;
globalCommandLineArgs = new CCommandLineArgs(argc, argv);

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

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

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 并在 main() 中初始化 CCommandLineArgs,这两者都是干净简单。