إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

Preprocessors

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • Preprocessors

    The PREPROCESSOR

    السلام عليكم ورحمة الله وبركاته :
    اهداء خاص ل ابو عبد الرحمن :
    ماهي ال The PREPROCESSOR هي عباره عن برنامج ملحق بمترج اللغه(the compiler) تستقبل الشفره المصدريه للبرنامج (source code) وتقول بتحليلها وتحيل ال PREPROCESSOR directives بها
    دعنا لا ننسي انها جزي من المترجم وايضا لاحظ انها تعمل سطر سطر وليس ك structure او منشاه
    لنبدا

    كود PHP:
    #include 
    يوقوم هذا ال directive باخبار المترجم انه عليه ان ياخذ محتويات الملف الذي ياتي بعد
    كود PHP:
    #include 
    ووضعه داخل ملف البرنامج ليقوم المبرمج باستخدام الدوال والماكروز المعرفه بداخل هذا الملف
    قد تتسال في يوم من االايام ماالفرق بين
    كود PHP:
    #include <file.h> 
    و
    كود PHP:
    #include "file.h" 
    حسنا الاولي تخص المكتبات الاساسيه في لغة السي أي التي تاتي ويقوم المترجم بلبحث عن هذا الملف في الاماكن التي تخزن فيها دوال اللغه مثل /usr/include وهكذا
    بينا الاخري تخبر المترجم بان هذا الملف قد يكون موجود بداخل مجلد البرنامج او قد يكون في مجلد اساسي لذلك يقوم المترجم بالبحث
    #define
    مهي وظيفة هذا ال directive وظيفته بالتحديد هي تحديد ثوابت او ماكروز لدوال او ثوابت عاديه
    راعي انه هناك طريقتان طريقه للدوال وطريقه لغير الدوال
    مثلا
    كود PHP:
    #define PF www.programming-freaks.net 
    في كل مره يتم استدعاء هذا الثابت يتم استبادل قيمته بالقيمه المتبعه في اسمه
    أي مكان في البرنامج؟ اجل : حقيقة انا اكذب أي مكان عدا بين " " في هذه الحاله تعتبر سلسله نصيه وليس اكثر
    ليس هذا فقط بي يمكنك عمل ماكرو لداله ايضا مثلا
    كود PHP:
    #define SAY_HAY(val) printf(#val); 
    او
    كود PHP:
    #define SAY_HAY(val) printf("%s",val); 
    بما ان SAY_HAY(val ) معرفه ك ماكرو لداله
    وبما ان استدعاء ذلك المكرو سوف يوقم باستبدال مابعد تعريفه
    وبما ان انه يمكن استبدال val ب argument اخر
    اذن
    كود PHP:
    SAY_HAY("Storm"); = printf("\"storm\""); 
    اراهن انك الان متحير عن ماهية هذا الشيئ
    حسنا
    كود PHP:
    Val="Storm" 
    صحيح اذن استبدال ب قيمتها المناظره في دالة الطباعه سوف تقوم بطباعة ماتم ارساله بالتحديد وهي "Storm"
    في هذه الحاله بدون stringizing operator (#) سوف تكون الطباعه هذا
    كود PHP:
    Printf(""storm""); 
    ويقوم المترجم باعطائك خطا كالاتي
    syntax error before "Storm"
    لماذا هذا لانك قيم بطاعة "" داخل "" بدون استخدام \ ك escape sequence أي انه يفقد مابعده قيمته الخاصه لان "" لها قيمه خاصه بانها بادئات وناهيات السلاسل النصيه
    اذن مافائدة # فائداتها هو منع حدوث ذلك اذا تم ارسال "storm" لها سوف تقوم بمعالجتها وجعلها
    \"Storm\"
    أي انه يمكنك طباعتا
    اظن ان الثانيه مفهومه جدا
    اذن فكل مابعد #define يتم استبادله بقيمته النصبه في البرنامج
    كود PHP:
     #undef 
    هي تماما عكس #define قد تستغرب لما قد تستخدم "في بعض الحالات تستخدم لمنع حدوث احتوء ملف مرتين
    مثلا عندما تقوم بكتباة برنامج وتقوم بعمل مكتبات خاصه بك تستخدم هذه لمنع حدوث احتواء مكتبه مرتين لان ذلك يسبب اخطاء"
    من ذلك لاحقا
    كود PHP:
    #if
    #ifdef
    #ifndef
    #else
    #elif
    #endif
    #error 
    من رائيي الخاص تستخمد هذا الdirectives لكي تعطي اكبر قدر من الاستقرار وال portability للبرنامج
    في بعض الاحيان تقوم بكتابة كود لكي يعمل علي نظام وتقوم بكتابة نفس الكود مره اخري ليعم علي نظام اخر
    هذا الاشياء تساعد كثيرا
    دعنا نبدا ب #if
    مثلها مثل if الشرطيه العاديه في البرنامج ولكن هذه تمتد لسطر واحد
    مثلا
    كود PHP:
    #if x >5
    //compiler this statements
    #else
    //compiler this one instead of the above
    #endif 
    راعي انها تستخدم لتحديد سلوك البرنامج وترجمته
    مثلا
    كود PHP:
    #include <stdio.h>

    Int main()
    {
            
    Int x;
            
    x=2;
           
    #if x >0
           
    Printf("This Is my system");
           
    #else
            
    Printf("This is your system");
            
    #endif

    قد تستغبر مافائدته وجود if الشرطيه اذن
    حسنا if الشرطيه لايمكنها تحديد ترجمة البرنامج من عدمه
    بينما #if يمكنها ذلك
    مثلا
    كود PHP:
    #ifdef DEBUG
    Printf("DEBUG MODE");
    #else
    Printf("NORMAL MODE");
    #endif 
    جرب وضعه في برنامج وترجمته كالاتي
    كود PHP:
    Gcc –Wall –ansi –DDEBUG file.c –o file
    ./file
    Output 
    :DEBUG MODE

    Gcc –Wall –ansi file
    .c –o file
    ./file 
    Output:NORMAL MODE
     لن اتكلم مجددا راجع الdecumintaion الخاصه بالمترجم الخاص بك
    بيمنا ان
    #ifndef = if not defined
    أي العكس تماما
    كود PHP:
    #ifndf COMPILE
    #error you don't ask for compiling process 
    #else
    Printf("NORMAL MODE");
    #endif 
    Gcc –Wall –ansi –D COMPILE file.c –o file
    ./file
    Output :NORMAL MODE

    Gcc –Wall –ansi file.c –o file
    ./file
    Output: #error you don't ask for compiling process
    ولن تتم ترجمة البرنامج بدون امارار –DCOMPILE
    لان #error اذا ظهرت تمنع عمل ترجمه للبرنامج مع وجود رساله

    حسنا يمكن أي ايضا استخدامها لمنع حدوث احتواء مرتين
    /*
    كود PHP:
    header.c*/
    #ifndef _HEADER_H
    #define _HEADER_H
    /* header code goes here*/
    #endif 
    أي انه اذا تم استدعاء الملف ولم يكن مستعدي من قبل يتم تعريفه و العكس صحيح
    اظنني ذكرت بما فيه الكفايه ولك ان تسال وتبحث
    نحن موجودون

    لغتي سخيفه ؟
    BOOOF , I AM GONE
    Still , you gotta wait for my PRESENT :D
    C programming arabic Tutorial|Programming-fr34ks

  • #2
    اهلا وسهلا باخونا St0rM-MaN ??

    وين هالغيباااااااااات ؟؟

    درس رائع جدا ،،
    ولكن لي بعض الملاحظات :::

    اولا : كما ذكرت ، ان المعالج التمهيدي perprocessor يأتي مع المترجم ، ويعمل قبل المترجم ،
    ووظيفته الاساسية هي البحث عن اوامره الخاصة ، والتي قمت بذكرها ،، وتبدأ بالرمز #
    ويقوم باستبدالها بالشيء المطلوب.

    مثلا التعليمة #include <cstdio>
    المترجم لا يتدخل فيها ،، فهي لل preprocessor ، حيث يقوم بحذفها واستبدالها بالملف cstdio

    وكذلك الحال مع الثوابت.

    النتيجة من هذه العملية preprocessor ، هو ملف بدون اي علامة #
    هذا الملف هو الذي سوف يترجم. وتستطيع ان تطلب من المترجم ان يضع لك نسخة من هذا الملف.
    لاحظ ان حجمه سيختلف كثيرا عن الملف الاصلي.



    ثانيا : ال Macros ::
    هي تشبه عمل الدالة ،، ولكنها سيئة جدا ،، لانها لا توفر حماية للنوع !!
    يعني ممكن تستخدم اي Macro باي قيمة !! عددية او نصية او اي شيء اخر ، مما يساعد على ظهور الاخطاء.

    البديل الممتاز لل macro هو ال inline function.


    تحياتي لك اخوي ،،
    وان شاء الله تكثر من هذي المواضيع ،،

    الى اللقـــاء،،

    تعليق

    يعمل...
    X