هل هناك طريقة لكتابة وحدات الماكرو باستخدام قائمة الوسائط المتغيرة في Visual C++؟

StackOverflow https://stackoverflow.com/questions/65037

سؤال

بقدر ما أعرف، في دول مجلس التعاون الخليجي يمكنك كتابة شيء مثل:

#define DBGPRINT(fmt...) printf(fmt);

هل هناك طريقة للقيام بذلك في VC++؟

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

المحلول

نعم ولكن فقط منذ VC++ 2005.بناء جملة المثال الخاص بك سيكون:

#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__)

المرجع الكامل هو هنا.

نصائح أخرى

نعم، يمكنك القيام بذلك في Visual Studio C++ في الإصدارات 2005 وما بعده (لست متأكدًا من VS 2003).نلقي نظرة على VA_ARGS.يمكنك القيام بشيء مثل هذا بشكل أساسي:

#define DBGPRINTF(fmt, ...)  printf(fmt, __VA_ARGS__)

وسيتم تمرير الوسائط المتغيرة للماكرو إلى الوظيفة المقدمة كوسائط '...'، حيث يمكنك بعد ذلك استخدام va_args لتحليلها.

يمكن أن يكون هناك سلوك غريب مع VA_ARGS واستخدام وحدات الماكرو.لأن VA_ARGS متغير، وهذا يعني أنه يمكن أن يكون هناك 0 وسيطات.قد يتركك ذلك بفواصل زائدة في مكان لم تكن تقصده.

إذا كنت لا تريد استخدام ملحقات غير قياسية، فيجب عليك توفير أقواس إضافية:

#define DBGPRINT(args) printf(args);
DBGPRINT(("%s\n", "Hello World"));

ما تبحث عنه يسمى [وحدات الماكرو المتنوعة](http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx).

ملخص الرابط :نعم، بدءًا من VC++ 2005 وما فوق.

إذا كنت لا تحتاج فعليًا إلى أي من ميزات وحدات الماكرو (__FILE__, __LINE__, ، لصق الرمز المميز، وما إلى ذلك) قد ترغب في التفكير في كتابة دالة متغيرة باستخدام stdargs.h.بدلا من الدعوة printf(), ، يمكن استدعاء دالة متغيرة vprintf() من أجل تمرير قوائم الوسائط المتغيرة.

بالنسبة لـ MSVC 7.1 (.NET 2003)، يعمل هذا:

#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif

يجب أن يعمل ما يلي.(انظر الرابط إلى وحدات الماكرو المتغيرة)

(المثال أدناه يوضح الوسيطات الثابتة والمتغيرة.)

#  define DBGPRINTF(fmt,...) \
    do { \
        printf(fmt, __VA_ARGS__); \
    } while(0)

بحث عن "VA_ARGS"و va_list في MSDN!

بالكاد.إنه أقبح من ذلك (وربما لا تريد فاصلة منقوطة في الماكرو نفسه:

#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')'

لتستخدمها:

DBGPRINT(("%s\n", "Hello World"));

(كان يفتقد زوجًا من الأقواس).

لست متأكدًا من سبب كل السلبيات، فالسؤال الأصلي لم يذكر إصدارًا من VC++، ولا يتم دعم وحدات الماكرو المتنوعة من قبل جميع المترجمين.

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