سؤال

هل يعرف أي شخص كيف يمكنني معرفة ما هي وحدات الماكرو المصممة/المحددة مسبقًا من Cl.exe؟ على سبيل المثال بالنسبة لـ GCC ، ستقوم سطر الأوامر التالي بإدراج جميع وحدات الماكرو الخاصة بالمترجمات

gcc -dM -E - </dev/null

تعديل: أنا مهتم بطريقة مشابهة لـ GCC's التي "اسأل المترجم الفعلي".

شكرًا

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

المحلول

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

يسمح برنامج التحويل البرمجي Microsoft C /C ++ بإجراء التذرع في الواجهة الأمامية لبرنامج التحويل البرمجي باستخدام مفاتيح سطر الأوامر /B1 و /BX لملفات .c و .cpp على التوالي. تمرر وحدة واجهة سطر الأوامر Cl.exe قائمة بالخيارات إلى الواجهة الأمامية للمترجم البديل عبر متغير بيئة MSC_CMD_FLAGS. تتضمن قائمة الخيارات هذه -D تعريفات الماكرو لبعض وحدات الماكرو المحددة مسبقًا.

يطبع المترجم التافلي للبديل التافهة التالي قائمة الخيارات التي تم تمريرها إليها:

/* MyC1.c */

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char *p;

    if ((p = getenv("MSC_CMD_FLAGS")) != NULL)
        printf("MSC_CMD_FLAGS:\n%s\n", p);

    if ((p = getenv("MSC_IDE_FLAGS")) != NULL)
        printf("MSC_IDE_FLAGS:\n%s\n", p);

    return EXIT_FAILURE;
}

قم بتجميع هذا إلى اسم قابل للتنفيذ ، على سبيل المثال ، "myc1.exe" ، تأكد من أنه مرئي في المسار وأخبر Cl.exe استدعاءه كطرق مترجم أمامي باستخدام أحد ما يلي:

cl /B1MyC1.exe AnyNameHere.c  
cl /BxMyC1.exe AnyNameHere.cpp  

قم بتضمين خيارات سطر الأوامر الأخرى كما هو مطلوب لمعرفة وحدات الماكرو المحددة مسبقًا لتلك المجموعة من الخيارات.

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

_MSC_EXTENSIONS  
_INTEGRAL_MAX_BITS=64  
_MSC_VER=1600  
_MSC_FULL_VER=160030319  
_MSC_BUILD=1  
_WIN32  
_M_IX86=600  
_M_IX86_FP=0  
_MT  

يبدو أن هذه التقنية تتضمن معظم وحدات الماكرو التي تعتمد على خيارات سطر الأوامر ، ولكنها تستبعد تلك التي يتم تعريفها دائمًا مثل __file__ و __date__.

نصائح أخرى

/P سوف ينبعث علم Preprocessor الماكرو النشط حاليًا على أساس إعدادات بناء المشروع. لست متأكدًا مما إذا كان هذا هو بالضبط ما يعادل أمر GCC الذي أظهرته. الإخراج في .I ملف.

الحصول على المعلومات في المصدر!

http://msdn.microsoft.com/en-us/library/b0084kay٪28v=vs.90٪29.aspx

جرب ال مشروع مسبق. وهي تحافظ على قاعدة بيانات من وحدات الماكرو المحددة مسبقًا للعديد من المنصات المستهدفة والمنصات المضيفة وأدوات الأدوات المترجمة.

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

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