الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

شرح Preprocessor Directives

بدأه SIFE في 10 يناير 2008 · 10 رد · 5,788 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته هذه أول مشاركة لي في قسم السي أتمنى أن تلحقها مشاركات أخرى أما بعد فمحتوى موضوعي هو Preprocessor Directives التي تستخدم في بداية نص البرنامج أي قبل الدالة main و مهمتها هي إخبار المترجم قبل الترجمة مثل include# فيهي أولا تضمن المكتبة ومن ثم نستعمل الدوال الموجودة فيها .

#define

يستخدم لتعيين قيمة ثابتة في كل البرنامج يمكن اللجوء إليها فيما بعد .

#define STRING "understanding Preprocessor Directives"

#define Age 2008

********************************************

#if,#elif,#else,#endif

تستخدم في الشرط و هي مثل if و else المستخدمة داخل السي فقط في تغير شكل الكتابة .

#if ss 10

 #define ss

#elif ss = =7 #define ss

#else 

  #define ss = =15

#endif

لاحظ أني في الأخير ختمتها ب endif# وذلك بمعنى إنتهاء الشرط .

********************************************

#error

تستعمل في إظهار رسالة خطأ في حالة عدم تحقق الشرط ،يمكن أيضا أن تمزجها مع الشرط if# و إن لم يتححق توقف عملية الترجمة

#if ss = = 7

#error "false"

#endif

********************************************

#ifdef,#ifndef

تستخدم في التحقق ما إن كانت قيمة معرفة أم لا

#define ss 7

#ifdef ss

the rest of code...

   or

#ifndef ss

#error "false, not defined"

********************************************

#line

تستخدم في تحديد سطر لملف و للتوضيح أكثر تخيل أن نقول :السطر 10 الملف ss.c

#line 10 "tool.c"

********************************************

#undef

يقوم بإلغاء الثوابت أو المختصرات التي قمنا نحن بتعريفها قصد إعادة تعيينها أو إلغائها

#define ss 7

#undef ss

********************************************

#include

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

هذا كل ما أعرفه و أعذروني على الشرح المختصر .

''‏اللهم إني أسالك إيمانا دائما وأسألك قلبا خاشعا وأسألك علما ‏نافعا وأسألك يقينا صادقا وأسألك دينا قيما وأسألك العافية من كل ‏بلية''

'‏اللهم أغفر للمؤمنين و المؤمنات و المسلمين و المسلمات الأحياء ‏منهم و الأموات'

www.it-scoop.com

#2

السلام عليكم ,,

شكراً جزيلاً لك أخي SIFE-C على الشرح المختصر و الرائع,

يبدو أنك بدأت جدياً بتعلم C B)

تحياتي ,,

#3
اقتباس
شكراً جزيلاً لك أخي SIFE-C على الشرح المختصر و الرائع,

يبدو أنك بدأت جدياً بتعلم C

لو أضاف شخص مثل ردك لإغترت نفسي .

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

تم تعديل هذه المشاركة بواسطة SIFE-C في 21 يناير 2008 في 19:32

''‏اللهم إني أسالك إيمانا دائما وأسألك قلبا خاشعا وأسألك علما ‏نافعا وأسألك يقينا صادقا وأسألك دينا قيما وأسألك العافية من كل ‏بلية''

'‏اللهم أغفر للمؤمنين و المؤمنات و المسلمين و المسلمات الأحياء ‏منهم و الأموات'

www.it-scoop.com

#4

ما قصرت يالغالي ..

اشتفدت من الموضوع كثيرا ..

لكن بالنسبه لـ

#ifndef

أذكر اني شفت أمر مشابه لها لكن يختلف في الاسبيلينق .. وينفذ نفس الأمر ..

اذا تعرفه أو يعرفه احد الأخوان ويفيدنا :)

تحياتي ..,

#5

الله يبارك فيك اخي ......

منتظرين جديدك الرائع ..

مع التحيه

#6

اضافه بسيطه :) ،

بالنسبه الى الـ Preprocessor Directive فهي لا تكون موجوده في الملف الناتج bin ، حيث عندما نبدأ عمليه الترجمه (وقبل أن يبدأ المترجم بعمله) يقوم الـ Preprocessor بعمله وهو التعامل مع الموجهات الخاصه به والتي تبدأ عاده بـ # .

المهم يتعامل المترجم التمهيدي Preprocessor مع تلك الموجهات عن طريق الأبدال Substitution حيث يقوم يتبديل جمله الـ # بالشيء المطلوب .

مثلا :

#include <iostream.h>

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

أيضا :

#define MAX 10

يقوم الـ Preprocessor بعمل Substitute لأي MAX في النص ب 10 ، وطبعا لا يراعي لنوع العمليه ، هل هي عمليه تتعامل مع عدد صحيح أو حقيقي ، لذلك تعبتر #define غير أمنه أبد Not type safe ، ولا يحبذ أبدا استخدامها في سي++ ، ويستخدم بدلا منها conts .

بالنسبه لجمل الـ Preprocessor فهي عاده ما تكون :

لتعريف ثابت

#define MAX 10

لتعريف ماكرو

#define func(x) ( (x) *(x) );

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

أيضا لتضمين ملف رأس Header File

#include <anyHeader.h>

وأخيرا للتعامل مع اوامر خاصه عند الترجمه Compile Complation

ومنها كما ذكرت :

#ifdef , #else , #ifndef .

بالنسبه الى #ifndef ، فهو العمليه المعاكسه لـ #ifdef ،

#define MAX
 #ifdef MAX 
cout << "MAX is Define !"; 
#else
cout << "MAX is  Not Define !";

هنا لأن MAX معرفه ، فان النتيجه هي MAX is define . وذلك لأن #ifdef نتظر اذا كان الثابت معرف true فهي تنفذ الجمله التاليه (مثلها مثل if العاديه) .

أما في المثال القادم ، ولأن MIN ليست معرفه ، فان النتيجه هي MIN is not Define ، وذلك لأن #ifndef تنفذ الجمله التاليه اذا كانت القيمه true .

#ifndef MIN
cout << "MIN is  Not Define !"; 
#else
cout << "MIN is  Define !";

باختصار يمكنك تخيل أن #ifdef هي سؤال "هل الثابت معرف"؟ واذا كان صحيح ينفذ الجمله التاليه والإ اذهب لـ #else اذا كانت هناك .

أما ifndef# هي سؤال "هل الثابت غير معرف؟" ؟ واذا كان صحيح ينفذ الجمله التاليه والإ اذهب لـ #else اذا كانت هناك .

بالنسبه للتعامل مع الماكرو والتي تبدأ #define ، فأيضا لا يفضل التعامل معها في سي++ ، لأن هناك العديد من الحلول الأخرى ، مثل استخدام inline Function ، أو مثلا استخدام القوالب Template .

باختصار ، حاول دائما أن تقلل من أستخدام #define ، ويفضل عدم استخدامها بالمره !

دمت بخير ....

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#7

السلام عليكم ,,

آه منك يا رومانسي

اقتباس
بالنسبه للتعامل مع الماكرو والتي تبدأ #define ، فأيضا لا يفضل التعامل معها في سي++ ، لأن هناك العديد من الحلول الأخرى ، مثل استخدام inline Function ، أو مثلا استخدام القوالب Template .

باختصار ، حاول دائما أن تقلل من أستخدام #define ، ويفضل عدم استخدامها بالمره !

أنا مع كلامك 100%, رغم أن لدي بعض الأسئلة العالقة في ذهني,

كيف تقوم اللغات الأخرى كـ Java مثلاً باستخدام الـ Generics ,, هل هي تطبيق لمبدأ الـ Polymorphism على سبيل المثال, وليست كالـ Templates في ++C ؟

الـ Templates لم تعد مجرد رفاهية في ++C في الحقيقة,

مكتبة STL و المكتبة القياسية القادمة Boost تستخدمان الـ Templates في كل شيء!

وها هي مكتبة blitz الرياضية تدعي أن كفائتها (مبرمجة بـ ++C ) تقارع المكتبات المبرمجة بـ Fortran و ذلك باستخدام الـ Templates !!

أما الـ Inline Template functions فهي آخر عجائب الـ ++C, رغم أني رايت الكثير من الشكاوي على النت حول ترجمة هذا النوع من الدوال, بحيث أن المترجمات تحولها إلى دوال عادية, و لكن لم أعرف المشكلة حتى أعرف الحل!

تحياتي ,,

#8

بالنسبه لـ Generic في جافا فأظنها هي تعمل بنفس مبدأ الـ Template في سي++ ، مع اني لم أتعامل معها من قبل ، ولكن أظنها كذلك :)

بخصوص موضوع الـ Template فهو يكثر استخدامه جدا عند بناء المكتبات البرمجيه مثل boost أو STL أو أي مكتبه أخرى . ويقل استخدامها في البرامج العاديه ..

وهناك العديد من الأمور الغامضه في هذا الموضوع ، حتى أن هناك كتب كامله حول موضوع القوالب :) .

دمت بخير ،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#9

يعطيك العافية اخووي

وارجوو انك تستمر في دروسك

#10

الف شكر اخي شرح جميل جدا وجزاك الله خير اخي .............

#11

جزاك الله كل خير على هذا الموضوع

مواضيع مشابهة