在 .m 文件中访问作为全局变量的结构
Accessing a Struct as a Global Var in a .m file
我有一个结构,其中包含指向值的指针,这些值必须在我的 class 中的多个函数中使用。我在header中typedef定义了类型,
typedef struct MyAUGraphPlayer {
AUGraph graph;
AudioUnit speechAU;
} MyAUGraphPlayer;
并在 .m 文件中声明,
@implementation SpeechGraph {
MyAUGraphPlayer player;
}
然而,在尝试初始化它时,我从这段代码中收到错误“意外表达式”(错误在 player = ... 行)
- (void)setup {
player = { 0 };
CreateMyAUGraph(&player);
}
player 变量被识别为 MyAUGraph 类型,但执行常规的 { 0 } 赋值会导致编译时错误。
我已经在命令行项目中很好地构建了这个 Core-Audio 代码,但现在我正在尝试围绕它构建一个 UI 并且显然是 C 核心内容和面向对象内容之间的一些混合给我造成了一些困惑。非常感谢您的帮助。
您只能在首次声明变量时对其进行初始化。当您的方法被调用时,初始化已经晚了。
你在这里试图做的事情被编译器解释为赋值(声明后只有一个 =
是初始化!)——右边的值是这里的一个块。这就是导致编译器错误的原因。
你必须手工完成(或者不是全部)。
首先:player
不是全局变量。它是SpeechGraph
.
的实例变量(ivar)
其次:在现代 Objective-C 中,默认情况下,实例变量在新 alloc
ed 对象中初始化为 0。无需再次将此值设置为 0。参见 Programming With Objective-C、"Working with Objects"、"Objects Are Created Dynamically"。
第三:如果你真的需要设置值,player = (MyAUGraphPlayer) { 0 };
应该可以。 (这是赋值,不是初始化。More about the difference.)
我认为您只能在声明结构时以这种方式初始化它。
MyAUGraphPlayer player = { 0 };
在你的情况下,你应该像这样使用 memset。
memset(&player,0,sizeof(MyAUGraphPlayer));
我有一个结构,其中包含指向值的指针,这些值必须在我的 class 中的多个函数中使用。我在header中typedef定义了类型,
typedef struct MyAUGraphPlayer {
AUGraph graph;
AudioUnit speechAU;
} MyAUGraphPlayer;
并在 .m 文件中声明,
@implementation SpeechGraph {
MyAUGraphPlayer player;
}
然而,在尝试初始化它时,我从这段代码中收到错误“意外表达式”(错误在 player = ... 行)
- (void)setup {
player = { 0 };
CreateMyAUGraph(&player);
}
player 变量被识别为 MyAUGraph 类型,但执行常规的 { 0 } 赋值会导致编译时错误。
我已经在命令行项目中很好地构建了这个 Core-Audio 代码,但现在我正在尝试围绕它构建一个 UI 并且显然是 C 核心内容和面向对象内容之间的一些混合给我造成了一些困惑。非常感谢您的帮助。
您只能在首次声明变量时对其进行初始化。当您的方法被调用时,初始化已经晚了。
你在这里试图做的事情被编译器解释为赋值(声明后只有一个 =
是初始化!)——右边的值是这里的一个块。这就是导致编译器错误的原因。
你必须手工完成(或者不是全部)。
首先:player
不是全局变量。它是SpeechGraph
.
其次:在现代 Objective-C 中,默认情况下,实例变量在新 alloc
ed 对象中初始化为 0。无需再次将此值设置为 0。参见 Programming With Objective-C、"Working with Objects"、"Objects Are Created Dynamically"。
第三:如果你真的需要设置值,player = (MyAUGraphPlayer) { 0 };
应该可以。 (这是赋值,不是初始化。More about the difference.)
我认为您只能在声明结构时以这种方式初始化它。
MyAUGraphPlayer player = { 0 };
在你的情况下,你应该像这样使用 memset。
memset(&player,0,sizeof(MyAUGraphPlayer));