Objective-C 变量在 C++ 中读为 null
Objective-C variables read as null in C++
我正在编写一个跨平台应用程序,需要将 argc
和 argv
从 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);
当使用调试器单步执行时,cmdlArgc
和 cmdlArgv
显示为有效数据,但 argc
和 argv
在赋值后仍然是 0 和 NULL。我在这里做错了什么?
您没有说明 cmdlArgc
和 cmdlArgv
是如何 声明的;它肯定在 header 文件中,但它看起来像什么?
main.m
之外的任何内容都无法访问这些已定义的变量 static
,这让我想知道为什么您没有收到链接器错误。我得出的结论是 cmdlArgc
和 cmdArgv
的声明是这样的:
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
,这两者都是干净简单。
我正在编写一个跨平台应用程序,需要将 argc
和 argv
从 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);
当使用调试器单步执行时,cmdlArgc
和 cmdlArgv
显示为有效数据,但 argc
和 argv
在赋值后仍然是 0 和 NULL。我在这里做错了什么?
您没有说明 cmdlArgc
和 cmdlArgv
是如何 声明的;它肯定在 header 文件中,但它看起来像什么?
main.m
之外的任何内容都无法访问这些已定义的变量 static
,这让我想知道为什么您没有收到链接器错误。我得出的结论是 cmdlArgc
和 cmdArgv
的声明是这样的:
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
,这两者都是干净简单。