الهدف C - هل أنظمة Systemsundid (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"];
    }
    ...
}

هل أنظمة Systemsundid (وهو UINT32) الذي تم تعيينه تلقائيا 0؟ أو يجب علي تعيينه صراحة؟ يجب أن أفعل ذلك بهذه الطريقة والاختبار لمعرفة ما إذا لم تتم تهيئته بواسطة طريقة الأدوات المساعدة لأنها لا تترجم إذا قمت بذلك static SystemSoundID soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];. وبعد في البداية حاولت تعيينها لتبنى، ولكن بعد ذلك أدركت أنه ليس مؤشرا، على أي حال، يجب أن يكون لدي = 0 هناك أم هو الحيل؟

هل كانت مفيدة؟

المحلول

لا ينطوي هذا السؤال على أي ميزات موضوعية C، لذلك يتم العثور على الإجابة في معيار C.

C99، القسم §6.7.8، الفقرة 10:

إذا لم يتم تهيئة كائن يحتوي على مدة تخزين ثابتة بشكل صريح، فعندئذ:

...

- إذا كان لديه نوع حسابي، يتم تهيئته (إيجابية أو غير موقعة) صفر؛

UINT32 (الذي هو نفسه فقط UINT32_T) هو نوع حسابي. وبالتالي، تهيئة إلى الصفر.

نصائح أخرى

هذا لا يحتوي على أي شيء يتعلق بالنوع - له علاقة بفئة التخزين. في C، يتم تهيئة المتغيرات الثابتة والعالمية تلقائيا إلى 0. لا تتم تهيئة المتغيرات المحلية العادية (السيارات) تلقائيا، لذلك عليك أن تفعل ذلك بنفسك أو سوف تحتوي على القمامة.

أعتقد أن الهدف - C يتبع نفس القواعد ك C لهذه.

يتم تهيئة المتغيرات الثابتة والعالمية إلى 0 بينما لا تتم تهيئة المتغيرات المحلية (أي تلقائية) ويمكن أن تبدأ بقيمة لا يمكن التنبؤ بها.

ومع ذلك، فإنه لا يضر بتهيئة القيمة بشكل صريح إلى 0.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top