Цель C - автоматически ли присваивается SystemSoundID (typedef'd UInt32) 0? - PullRequest
1 голос
/ 02 октября 2009
- (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 ]

4 голосов
/ 02 октября 2009

Этот вопрос не включает никаких объективных функций c, поэтому ответ находится в стандарте c.

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

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

...

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

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

2 голосов
/ 02 октября 2009

Я полагаю, что цель-c следует тем же правилам, что и С. Для этого.

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

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

2 голосов
/ 02 октября 2009

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

...