목표 c- SystemsoundID (typedef'd UINT32)가 자동으로 할당되어 있습니까?
-
19-09-2019 - |
문제
- (void)playAlarmSound:(NSTimer *)theTimer {
static SystemSoundID soundID/* = 0 */; // ?
if (!soundID) {
soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];
}
...
}
SystemSoundID (UINT32)는 자동으로 할당 된 것입니까? 아니면 명시 적으로 할당해야합니까? 이런 식으로 수행하고 유틸리티 메소드가 초기화되지 않았는지 테스트해야합니다. static SystemSoundID soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];
. 처음에 나는 그것을 NULL에 할당하려고 시도했지만, 나는 그것을 포인터가 아니라는 것을 깨달았습니다. = 0
거기에 있었습니까 아니면 중복됩니까?
해결책
이 질문에는 대상 C 기능이 포함되지 않으므로 답은 C 표준에 있습니다.
C99, 섹션 §6.7.8, 단락 10 :
정적 저장 시간이있는 객체가 명시 적으로 초기화되지 않은 경우 :
...
- 산술 유형이있는 경우 (양수 또는 서명되지 않은) 0으로 초기화됩니다.
UINT32 (자체 자체는 UINT32_T)는 산술 유형입니다. 따라서 0으로 초기화되었습니다.
다른 팁
이것은 유형과 관련이 없습니다. 스토리지 클래스와 관련이 있습니다. C에서는 정적 및 글로벌 변수가 자동으로 0으로 초기화됩니다. 일반 로컬 (자동) 변수는 자동으로 초기화되지 않으므로 직접 수행해야합니다. 그렇지 않으면 쓰레기가 포함되어 있습니다.
나는 객관적인 C가 이것에 대해 C와 동일한 규칙을 따른다고 생각합니다.
정적 및 글로벌 변수는 0으로 초기화되고 로컬 (IE Auto) 변수는 초기화되지 않으며 예측할 수없는 값으로 시작할 수 있습니다.
즉, 값을 0으로 명시 적으로 초기화하는 것은 아프지 않습니다.