【问题标题】:Accessing a Struct as a Global Var in a .m file将 Struct 作为 .m 文件中的全局变量访问
【发布时间】:2015-12-30 19:39:03
【问题描述】:

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

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

并在 .m 中声明,

@implementation SpeechGraph {
    MyAUGraphPlayer player;
}

但是,当尝试初始化它时,我从这段代码中得到错误“Unexpected expression”(错误就在 player = ...)

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

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

我已经在命令行项目中很好地构建了这个 Core-Audio 代码,但现在我正试图围绕它构建一个 UI,显然 C 核心内容和面向对象的内容之间的一些混合给我造成了一些混乱.我将不胜感激。

【问题讨论】:

    标签: c struct core-audio


    【解决方案1】:

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

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

    第三:如果你真的需要设置值,player = (MyAUGraphPlayer) { 0 }; 应该可以工作。 (这是赋值,不是初始化。More about the difference.

    【讨论】:

    • player = (MyAUGraphPlayer) { 0 } 是赋值而不是初始化,但没关系。
    【解决方案2】:

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

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

    您必须手动(或不是全部)完成。

    【讨论】:

    • 得到同样的错误。奇怪的是我可以很容易地在一个函数中说 `MyAUGraphPlayer player = { 0}' 并且它很好,但只是试图使该播放成为一个全局声明的常量会导致这个错误。
    • @AlexanderBollbach 抱歉,我没有正确考虑您的问题。答案已更新...
    【解决方案3】:

    我认为您只能在声明结构时以这种方式初始化它。

    MyAUGraphPlayer 玩家 = { 0 };

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

    memset(&player,0,sizeof(MyAUGraphPlayer));

    【讨论】:

    • memset 有必要吗?我记得如果结构在本地声明并且如果它们是类成员变量则不将其所有字段“归零”?如果是这种情况,则不需要 memset,不是吗?
    • 我认为目标 c 对象的 ivars 在初始化时将其所有位清零。局部变量绝对不会。为了安全起见,我个人只是一直初始化所有内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 2011-09-01
    相关资源
    最近更新 更多