目标C - SystemSoundID(typedef'd UInt32)是否自动分配为0?

时间:2009-10-02 00:38:26

标签: c objective-c initialization zero uint32

- (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"];它就不会编译。起初我尝试将它分配给NULL,但后来我意识到它不是一个指针,所以无论如何,我应该在那里有= 0还是多余的?

3 个答案:

答案 0 :(得分:4)

此问题不涉及任何Objective-c功能,因此答案可在c标准中找到。

C99,第§6.7.8节,第10段:

  

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

     

...

     

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

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

答案 1 :(得分:2)

这与类型没有任何关系 - 它与存储类有关。在C中,静态和全局变量自动初始化为0.普通的本地(自动)变量不会自动初始化,因此您必须自己进行,否则它们将包含垃圾。

答案 2 :(得分:2)

我认为objective-c遵循与C相同的规则。

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

也就是说,将值显式初始化为0并没有什么坏处。