在.m文件中访问Struct作为全局变量

时间:2015-12-30 19:39:04

标签: c struct core-audio

我有一个结构,其中包含指向必须在我的班级中的多个函数中使用的值的指针。我在标题中定义了类型

typedef struct MyAUGraphPlayer {
    AUGraph graph;
    AudioUnit speechAU;
 } MyAUGraphPlayer;

并在.m,

中声明
@implementation SpeechGraph {
    MyAUGraphPlayer player;
}

然而,在尝试初始化它时,我从此代码中得到错误“Unexpected expression”(错误在于行播放器= ...)

- (void)setup { 
   player = { 0 };
   CreateMyAUGraph(&player);
}

播放器变量被识别为MyAUGraph类型,但执行传统的{0}赋值会导致编译时错误。

我已经在命令行项目中构建了这个Core-Audio代码,但是现在我正在尝试围绕它构建一个UI,显然C核心内容和面向对象之间的某些混合让我感到困惑。我非常感谢一些帮助。

3 个答案:

答案 0 :(得分:2)

首先:player不是全局变量。它是SpeechGraph的实例变量(ivar)。

第二:在现代Objective-C中,默认情况下,实例变量在新alloc ed对象中初始化为0。无需再次将此值设置为0。请参阅Programming With Objective-C,"使用对象","对象是动态创建的"。

第三:如果你真的需要设置值,player = (MyAUGraphPlayer) { 0 };应该有效。 (这是一项任务,而不是初始化。More about the difference.

答案 1 :(得分:1)

您只能在首次声明变量时初始化变量。当你的方法被调用时,它已经很晚才进行初始化。

您在此处尝试执行的操作被解释为编译器的赋值(在声明初始化后仅=!) - 右侧值是此处的块。这是导致编译器错误的原因。

你必须亲自(或不是全部)这样做。

答案 2 :(得分:0)

我认为你只能在声明时初始化一个结构。

  

MyAUGraphPlayer player = {0};

在你的情况下,你应该像这样使用memset。

  

memset的(安培;播放器,0,的sizeof(MyAUGraphPlayer));