سؤال

وأود أن رمز في بعض وحدات الماكرو قبل المعالج لاختياريا تسجيل بعض المعلومات. على سبيل المثال في .H

//#define ML_DEBUG(x) (x)  // flip this bit to do the error logging
#define ML_DEBUG(x) (1==1) // flip this bit to silence

وفي .M I تنفيذ مثل:

ML_DEBUG(NSLog(@"Class dealloc: %@", [NSString stringWithCString:object_getClassName(self)]));

والرمز يعمل بشكل جيد كما سبق تقديمه. ومع ذلك لا أعتقد أن بلدي "لا تفعل شيئا" القضية هي كما خفيفة الوزن لأنه يمكن أن يكون. وكان من المتوقع أن يكتب:

//#define ML_DEBUG(x) (x)  // flip this bit to do the error logging
#define ML_DEBUG(x) (;) // flip this bit to silence

ومنذ فاصلة منقوطة وحيد هو بيان الهدف-ج صحيح، كنت أتوقع هذا من شأنه أن يعمل، ولكن المترجم تقول لي:

expected expression before ';' token

وسؤالي هو: هل يمكنني اختيار أكثر خفيفة الوزن "لا تفعل شيئا" بيان، باستخدام 1==1 أم أن هناك طريقة أقل كثافة للقيام بذلك. أو ربما توجهي بأكمله إلى تسجيل التصحيح المؤقت هو الخطأ التي ترأسها؟

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

المحلول

وأبسط شيء هو تعريف فارغة:

#define ML_DEBUG(x)

وهذا يعمل لمعظم الحالات، ولكنه لا يعمل مع المشغل الثلاثي، منها مثلا:

something ? ML_DEBUG(x) : ML_DEBUG(y);

ومن أجل العمل لهذا (مفتعلة باعتراف الجميع) سبيل المثال، يمكنك القيام بذلك:

#define ML_DEBUG(x) ((void)0)

وانها صالحة تماما للادلاء الأمور إلى باطل - تقول للمترجم أن كنت تجاهل بشكل واضح نتيجة للتعبير

.

وانها لهذا السبب أن يحصل تحول معيار ANSI C assert() ماكرو إلى ((void)0) عند تعريف NDEBUG بدلا من العبارة فارغة.

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