Цель C - автоматически назначается SystemOundid (typedef'd uint32) 0?
-
19-09-2019 - |
Вопрос
- (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.