سؤال

وأريد أن يكون C قبل المعالج الذي تصفية بعض التصريحات # تعريف من المصدرية دون تغيير أي شيء آخر.

لماذا؟ يجب استخدام هذا لإزالة بعض العملاء رمز معين من المصادر إذا تم تسليم المصدر إلى عميل آخر.

لا أحد يعرف من حل موجود؟

وشكرا! سيمون

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

المحلول

ويمكنك استخدام شيء من هذا القبيل AWK بدلا من CPP؟ إضافة بعض الأعلام في التعليمات البرمجية التي تحيط قطعة من رمز المراد إزالتها. على سبيل المثال:

(...)
//BEGIN_REMOVE_THIS_CODE

printf("secret code");

//END_REMOVE_THIS_CODE
(...)

وبعد ذلك كتابة السيناريو AWK لإزالة هذا الرمز، شيء من هذا القبيل ...

BEGIN { write=1;}
/^\/\/BEGIN_REMOVE_THIS_CODE/ { write=0; next;}
/^\/\/END_REMOVE_THIS_CODE/ { write=1; next;}
    {
    if(write==1) print $0;
    }

نصائح أخرى

وهذا يبدو وكأنه ما سألت عنه في <لأ href = "https://stackoverflow.com/questions/525283/is-there-ac-pre-processor-which-eliminates-ifdef-blocks-based-on- قيم تعريف "> هل هناك C قبل المعالج الذي يلغي ifdef كتل على أساس القيم المحددة . وكانت أفضل إجابة حصلت sunifdef، أو "ابن unifdef"، التي عملت بشكل موثوق بالنسبة لي على بعض ملتوية بشكل مفرط كود مشروط (على الخام المتراكمة أكثر من 20 عاما من التنمية على مجموعة واسعة من المنصات مع نظرية عدم كفاية كيفية قيام تجميع الخاصة بالنظام الأساسي).

وأنا لا أعتقد أنك في حاجة الى المعالج لهذا الغرض. إذا لم يكن لديك متداخلة في #ifdef في التعليمات البرمجية، يمكن لأي محرك التعابير المنطقية إزالة أي شيء يقع بين #ifdef CLIENT و#endif (استخدام مطابقة غير الجشع لمباراة #endif أولا، وليس آخر).

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

ووضع استدعاء دالة التي سيتم فافات الخروج أو (I ننسى المصطلح المناسب) مرتبطة بشكل فضفاض بحيث ظيفة أخرى يمكن وضعها في مكانها.

وأوصي باستخدام طبقة إضافية لغة الماكرو لتصفية الرموز، مثل filepp . يمكنك استخدام بناء الجملة دية C المعالج للتعبير عن الأجزاء التي تنتمي إلى أي عملاء.

//%ifdef CLIENT_A
  code for client A
//%endif

//%ifdef CLIENT_B
  code for client B
//%endif

//%if "CLIENT_A" || "CLIENT_B"
  code for client A and B
//%endif

والبادئة '//٪' تمكنك من ترجمة التعليمات البرمجية معدلة. يجوز لك تشغيل filepp قبل أن إعطاء التعليمات البرمجية إلى العميل.

إذا كنت تستخدم دول مجلس التعاون الخليجي، ثم يمكنك استخدام:

gcc <insert files here> -E

والخيار -E يقول دول مجلس التعاون الخليجي إلى المعالجة المسبقة فقط على المصادر، وعدم تجميع لهم.

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

grep -r '#define CLIENT_CODE' ./*.h 

ويمكنك أيضا محاولة unifdef الذي هو أبسط بدلا من sunifdef.

وبقدر ما أعرف ... يمكن تشغيل المعالج كخطوة منفصلة (باستخدام مترجم و optios الصحيحة). بهذه الطريقة يمكنك أن تفعل ما تريد مع رمز معالجتها.

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