Цель C - автоматически назначается SystemOundid (typedef'd uint32) 0?

StackOverflow https://stackoverflow.com/questions/1507215

Вопрос

- (void)playAlarmSound:(NSTimer *)theTimer {
    static SystemSoundID soundID/* = 0 */; // ?
    if (!soundID) {
        soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];
    }
    ...
}

SystemSoundid (который является UINT32) автоматически назначен 0? Или я должен явно назначить это? Я должен сделать это таким образом и проверить, чтобы увидеть, не было ли он инициализирован методом утилит, потому что он не компилируется, если я просто делаю static SystemSoundID soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];. Анкет Сначала я попытался назначить его NULL, но потом я понял, что это не указатель, так что в любом случае, если у меня есть = 0 Там или это избыточно?

Это было полезно?

Решение

Этот вопрос не связан с какими-либо объектами C, поэтому ответ находится в стандарте C.

C99, раздел §6.7.8, пункт 10:

Если объект с статической продолжительностью хранения не инициализируется явно, то:

...

- Если он имеет арифметический тип, он инициализируется (положительно или без знака) ноль;

Uint32 (который сам по себе является просто UINT32_T) - это арифметический тип. Следовательно, инициализируется до нуля.

Другие советы

Это не имеет никакого отношения к типу - это связано с классом хранения. В C статические и глобальные переменные автоматически инициализируются до 0. Обычные локальные (автоматические) переменные не инициализируются автоматически, поэтому вы должны сделать это самостоятельно, или они будут содержать мусор.

Я считаю, что Objective-C следует те же правила, что и C для этого.

Статические и глобальные переменные инициализируются до 0, в то время как локальные (т.е. Auto) переменные не инициализируются и могут начинаться с непредсказуемого значения.

Тем не менее, не помешает явно инициализировать значение до 0.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top