代码之家  ›  专栏  ›  技术社区  ›  mk12

目标C-系统声音ID(typedef'd uint32)是否自动分配为0?

  •  1
  • mk12  · 技术社区  · 16 年前
    - (void)playAlarmSound:(NSTimer *)theTimer {
        static SystemSoundID soundID/* = 0 */; // ?
        if (!soundID) {
            soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];
        }
        ...
    }
    

    SystemsoundID(uint32)是否自动分配为0?或者我应该明确地分配它?我必须这样做,并测试它是否还没有被utilities方法初始化,因为如果我只是这样做,它就不会编译。 static SystemSoundID soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"]; .起初我试图将它赋给空,但后来我意识到它不是指针,所以无论如何,我应该拥有 = 0 在那里还是多余的?

    3 回复  |  直到 16 年前
        1
  •  4
  •   Stephen Canon    16 年前

    这个问题不涉及任何客观的C特性,所以答案可以在C标准中找到。

    C99,第6.7.8节,第10段:

    如果一个对象 静态存储持续时间不是 显式初始化,然后:

    ……

    如果它有算术类型,它是 初始化为(正或无符号) 零;

    uint32(本身就是uint32)是一种算术类型。因此,初始化为零。

        2
  •  2
  •   Chuck    16 年前

    这与“存储类”没有任何关系。在C语言中,静态变量和全局变量自动初始化为0。普通的局部(自动)变量不会自动初始化,所以您必须自己初始化,否则它们将包含垃圾。

        3
  •  2
  •   R Samuel Klatchko    16 年前

    我相信目标C和C的规则是一样的。

    静态和全局变量初始化为0,而本地(即自动)变量未初始化,并且可以以不可预测的值开始。

    这就是说,将值显式初始化为0并不有害。