C/C++ سلسلة سلسلة ماكرو




c-preprocessor (2)

#define STR1      "s"
#define STR2      "1"
#define STR3      STR1 ## STR2

هل من الممكن لسلسلتها STR3 == "s1"؟ يمكنك القيام بذلك عن طريق تمرير args إلى دالة Macro أخرى. ولكن هل هناك طريقة مباشرة؟


إذا كان كلتا السلسلتين يمكنك القيام فقط:

#define STR3 STR1 STR2

يقوم المعالج الأولي تلقائياً بتوصيل سلاسل متجاورة.

تصحيح:

كما هو مذكور أدناه ، فهو ليس المعالج الأولي ولكن المترجم الذي يقوم بالتسلسل.


تلميح: إن STRINGIZE الماكرو أعلاه رائع ، ولكن إذا قمت بخطأ ما ، وكانت حجته ليست كلية - كان لديك خطأ مطبعي في الاسم ، أو نسيت أن #include ملف الرأس - عندها سيضع المحول البرمجي بسعادة الماكرو المزعوم الاسم في السلسلة بدون خطأ.

إذا كنت تريد أن تكون الوسيطة لـ STRINGIZE دائمًا STRINGIZE بقيمة C عادية ، STRINGIZE ذلك

#define STRINGIZE(A) ((A),STRINGIZE_NX(A))

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

استغرق الأمر بعض الوقت لمعرفة سبب STRINGIZE(ENOENT) كـ "ENOENT" بدلاً من "2" ... لم أكن قد أدرجت errno.h .





c-preprocessor