هل هناك طريقة لكتابة وحدات الماكرو باستخدام قائمة الوسائط المتغيرة في Visual C++؟
-
09-06-2019 - |
سؤال
بقدر ما أعرف، في دول مجلس التعاون الخليجي يمكنك كتابة شيء مثل:
#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++، ولا يتم دعم وحدات الماكرو المتنوعة من قبل جميع المترجمين.