شروط التضمين
هذه التوجيهات يمكنك من خلالها ترجمة جزء معين من ملف المصدر (الكود البرمجي),وبذلك أنت يمكنك التحكم بأي جزء تريد باستخام هذه التوجيهات if#, #else, #elif, #ifdef, #ifndef ,#endif
التركيب
| #if expression | |||||||||
| #elif expression | |||||||||
| #ifdef expression | |||||||||
| #ifndef expression | |||||||||
| #else expression | |||||||||
| #endif expression | |||||||||
الشرح
معالجة التوجيهات الشرطية تبدأ ب ifdef# أو التوجيهة ifndef# أو يمكن استخدام if# ; ثم بعد ذلك يتم استخدام elif# بشكل اختياري , كما يمكن استخدام elif# على الأقل مرة واحدة بشكل اختياري أيضا , عندالانتهاء يتم استخدام التوجيهة endif# .
أي توجيهات شرطية داخلية تتم معالجتها منفردة.
كل من التوجيهات التالية if# و ifdef# و ifndef# و elif# و else# تستمر بالتحكم حتى تجد واحدة من التوجيهات التالية
endif# أو else# أو elif#.
كل من ifndef# و if# و ifnde# , تقوم باختبار القيمة المعطاة أهي معرفة أم لا فاذا كانت القيمة معرفة فان المترجم سيدخل الى كتلة الكود ويبدء المعالجة وفي هذه الحالة سيتم تجاهل التوجيهات التالية else# و elif# اذا كانت موجودة (لايتم تجاهل التوجيهات الموجودة داخل العمليات الداخلية بل يتم تجاهل التوجيهات التي في نفس المستوى -انظر الى المثال رقم2-).
أما اذا كانت القيمة غير معرفة فانه سيتم تخطي كتلة الكود الحالية وسيتم معالجة كتلة الكود الموجود داخل التوجيهات else# و elif# , اذا كانت موجودة .
مثال 1
#define ABCD 2
#include <iostream>
int main()
{
#ifdef ABCD
std::cout << "1: yes\n";
#else
std::cout << "1: no\n";
#endif
#ifndef ABCD
std::cout << "2: no1\n";
#elif ABCD == 2
std::cout << "2: yes\n";
#else
std::cout << "2: no2\n";
#endif
#if !defined(DCBA) && (ABCD < 2*4-3)
std::cout << "3: yes\n";
#endif
}
النتائج
1: yes
2: yes
3: yes
مثال 2
#include <iostream>
#define ILOVECPP
int main()
{
#ifdef ILOVECPP /*1*/
#ifdef too /*2*/
std::cout << "I love you too !" << std::endl << std::endl ;
#else /*2*/
std::cout << "I love you little !" << std::endl << std::endl ;
#endif/*2*/
#else /*1*/
std::cout << "But i still love you!" << std::endl << std::endl ;
#endif /*1*/
}
النتائج
I love you little !
الشرح
التوجيهات من نفس الأرقام هي من نفس مستوى كتلة الكود .
1 : التوجيهات من المستوى الأول : في هذا المستوى سيتم تجاهل else# رقم واحد لأن القيمة معرفة ( ILOVECPP ) . ولن يتم تجاهل else# الأخرى (التي تحمل الرقم2 )لأنها ليست من نفس المستوى .
2 : التوجيهات من المستوى الثاني : في هذا المستوى سيتم تفقد القيمة اذا كانت معرفة أم لا (وهي ليست معرفة ) أي أنه سيتم الدخول الى التوجيه else# رقم 2 ومعالجة كتلة الكود .
بالنسبة للتوجيهة endif# فلكل مستوى توجيهة تقوم بانهائه.