قبل المعالج ماكرو التصحيح لتسجيل اختياري
-
05-07-2019 - |
سؤال
وأود أن رمز في بعض وحدات الماكرو قبل المعالج لاختياريا تسجيل بعض المعلومات. على سبيل المثال في .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
بدلا من العبارة فارغة.