مقدمة

غالباً ما يجد المطورون أنفسهم بحاجة إلى آلية تسجيل موثوقة لأغراض التصحيح. ومع ذلك، فإن الحفاظ على كود فعال أثناء الإنتاج يمكن أن يكون تحدياً، خاصةً عندما يمكن أن يؤثر التسجيل المفصل على الأداء. وتثير تساؤلات شائعة: كيف يمكنك إنشاء دالة تستخدم فقط لأغراض التصحيح تدعم قائمة متغيرة من الأرجومنتات، مشابهة لـ printf()؟

في هذه التدوينة، سنستكشف حلاً بسيطاً يستخدم توجيهات ما قبل المعالجة في C/C++ لإنشاء دالة تسجيل تصحيح الأخطاء يمكن إزالتها أثناء النسخ المحسنة مع الحفاظ على مرونة المدخلات المتغيرة.

إنشاء دالة تسجيل تصحيح الأخطاء

الخطوة 1: تحديد توقيع الدالة

نريد أن تقبل دالة التسجيل لدينا سلسلة تنسيق وعدد متغير من الأرجومنتات. يسمح توقيع دالة على نمط printf بتنسيق السلاسل ديناميكياً. أدناه هي الهيكلية الأساسية للدالة المطلوبة:

void XTrace(LPCTSTR lpszFormat, ...);

الخطوة 2: استخدام الأرجومنتات المتغيرة

لتحقيق وظيفة الأرجومنتات المتغيرة، يمكننا استخدام الماكرو va_list وva_start وva_end المقدمة من مكتبة C القياسية. هذا يسمح لنا بمعالجة الأرجومنتات المرسلة إلى XTrace.

إليك كيفية تطبيق ذلك:

#include <stdio.h>

void XTrace(LPCTSTR lpszFormat, ...) {
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[512]; // نظرًا لاستخدام تخصيص ديناميكي بدلاً من ذلك
    nBuf = _vsnprintf(szBuffer, 511, lpszFormat, args);
    ::OutputDebugString(szBuffer); 
    va_end(args);
}

العناصر الرئيسية في الكود:

  • va_list args: يتم استخدامه لتخزين قائمة الأرجومنتات.
  • va_start(args, lpszFormat): يقوم بتهيئة args لاسترجاع الأرجومنتات بعد lpszFormat.
  • _vsnprintf: تقوم هذه الدالة بتنسيق السلسلة باستخدام قائمة الأرجومنتات وتكتبها في المخزن المؤقت.
  • OutputDebugString: تخرج السلسلة المنسقة إلى نافذة إخراج المصحح.

الخطوة 3: التجميع الشرطي

لضمان إزالة دالة التصحيح في النسخ المحسنة، يمكننا استخدام توجيهات ما قبل المعالجة. من خلال تعريف ماكرو بناءً على علامة التصحيح، يمكننا التحكم في ما إذا كان يجب تضمين دالة التسجيل لدينا أم استبعادها.

إعداد المثال:

#ifdef _DEBUG
#define XTRACE XTrace
#else
#define XTRACE
#endif
  • سيشير الماكرو XTRACE إلى دالة XTrace الفعلية عند التجميع في وضع التصحيح. في النسخ المحسنة (عندما لا تُعرّف _DEBUG)، سيصبح XTRACE عبارة عن بيان فارغ، مما يلغي فعليًا أي كود لتسجيل التصحيح.

جمع كل شيء معًا

إليك التنفيذ الكامل من أجل الوضوح:

#include <stdio.h>
#include <stdarg.h>
#include <Windows.h> // أو <Linux/string.h> حسب النظام الأساسي

void XTrace0(LPCTSTR lpszText) {
    ::OutputDebugString(lpszText);
}

void XTrace(LPCTSTR lpszFormat, ...) {
    va_list args;
    va_start(args, lpszFormat);
    int nBuf;
    TCHAR szBuffer[512];
    nBuf = _vsnprintf(szBuffer, 511, lpszFormat, args);
    ::OutputDebugString(szBuffer);
    va_end(args);
}

#ifdef _DEBUG
#define XTRACE XTrace
#else
#define XTRACE
#endif

يمكنك الآن استخدام ماكرو XTRACE في كودك كما يلي:

XTRACE("تحذير: القيمة %d > 3!\n", value);

الخاتمة

إنشاء دالة لتسجيل تصحيح الأخطاء في C/C++ يمكنها قبول أرجومنتات متغيرة ليس فقط ممكناً ولكن يمكن إدارته بشكل فعال باستخدام توجيهات ما قبل المعالجة. هذه التقنية تبقي كود الإنتاج لديك نظيفاً وفعالاً في الأداء.

الآن، يمكنك تصحيح تطبيقاتك بفعالية دون التفريط في الأداء في بيئة الإنتاج!