The PREPROCESSOR
السلام عليكم ورحمة الله وبركاته :
اهداء خاص ل ابو عبد الرحمن :
ماهي ال The PREPROCESSOR هي عباره عن برنامج ملحق بمترج اللغه(the compiler) تستقبل الشفره المصدريه للبرنامج (source code) وتقول بتحليلها وتحيل ال PREPROCESSOR directives بها
دعنا لا ننسي انها جزي من المترجم وايضا لاحظ انها تعمل سطر سطر وليس ك structure او منشاه
لنبدا
يوقوم هذا ال directive باخبار المترجم انه عليه ان ياخذ محتويات الملف الذي ياتي بعد
ووضعه داخل ملف البرنامج ليقوم المبرمج باستخدام الدوال والماكروز المعرفه بداخل هذا الملف
قد تتسال في يوم من االايام ماالفرق بين
و
حسنا الاولي تخص المكتبات الاساسيه في لغة السي أي التي تاتي ويقوم المترجم بلبحث عن هذا الملف في الاماكن التي تخزن فيها دوال اللغه مثل /usr/include وهكذا
بينا الاخري تخبر المترجم بان هذا الملف قد يكون موجود بداخل مجلد البرنامج او قد يكون في مجلد اساسي لذلك يقوم المترجم بالبحث
#define
مهي وظيفة هذا ال directive وظيفته بالتحديد هي تحديد ثوابت او ماكروز لدوال او ثوابت عاديه
راعي انه هناك طريقتان طريقه للدوال وطريقه لغير الدوال
مثلا
في كل مره يتم استدعاء هذا الثابت يتم استبادل قيمته بالقيمه المتبعه في اسمه
أي مكان في البرنامج؟ اجل : حقيقة انا اكذب أي مكان عدا بين " " في هذه الحاله تعتبر سلسله نصيه وليس اكثر
ليس هذا فقط بي يمكنك عمل ماكرو لداله ايضا مثلا
او
بما ان SAY_HAY(val ) معرفه ك ماكرو لداله
وبما ان استدعاء ذلك المكرو سوف يوقم باستبدال مابعد تعريفه
وبما ان انه يمكن استبدال val ب argument اخر
اذن
اراهن انك الان متحير عن ماهية هذا الشيئ
حسنا
صحيح اذن استبدال ب قيمتها المناظره في دالة الطباعه سوف تقوم بطباعة ماتم ارساله بالتحديد وهي "Storm"
في هذه الحاله بدون stringizing operator (#) سوف تكون الطباعه هذا
ويقوم المترجم باعطائك خطا كالاتي
syntax error before "Storm"
لماذا هذا لانك قيم بطاعة "" داخل "" بدون استخدام \ ك escape sequence أي انه يفقد مابعده قيمته الخاصه لان "" لها قيمه خاصه بانها بادئات وناهيات السلاسل النصيه
اذن مافائدة # فائداتها هو منع حدوث ذلك اذا تم ارسال "storm" لها سوف تقوم بمعالجتها وجعلها
\"Storm\"
أي انه يمكنك طباعتا
اظن ان الثانيه مفهومه جدا
اذن فكل مابعد #define يتم استبادله بقيمته النصبه في البرنامج
هي تماما عكس #define قد تستغرب لما قد تستخدم "في بعض الحالات تستخدم لمنع حدوث احتوء ملف مرتين
مثلا عندما تقوم بكتباة برنامج وتقوم بعمل مكتبات خاصه بك تستخدم هذه لمنع حدوث احتواء مكتبه مرتين لان ذلك يسبب اخطاء"
من ذلك لاحقا
من رائيي الخاص تستخمد هذا الdirectives لكي تعطي اكبر قدر من الاستقرار وال portability للبرنامج
في بعض الاحيان تقوم بكتابة كود لكي يعمل علي نظام وتقوم بكتابة نفس الكود مره اخري ليعم علي نظام اخر
هذا الاشياء تساعد كثيرا
دعنا نبدا ب #if
مثلها مثل if الشرطيه العاديه في البرنامج ولكن هذه تمتد لسطر واحد
مثلا
راعي انها تستخدم لتحديد سلوك البرنامج وترجمته
مثلا
قد تستغبر مافائدته وجود if الشرطيه اذن
حسنا if الشرطيه لايمكنها تحديد ترجمة البرنامج من عدمه
بينما #if يمكنها ذلك
مثلا
جرب وضعه في برنامج وترجمته كالاتي
Output:NORMAL MODE
لن اتكلم مجددا راجع الdecumintaion الخاصه بالمترجم الخاص بك
بيمنا ان
أي العكس تماما
ولن تتم ترجمة البرنامج بدون امارار –DCOMPILE
لان #error اذا ظهرت تمنع عمل ترجمه للبرنامج مع وجود رساله
حسنا يمكن أي ايضا استخدامها لمنع حدوث احتواء مرتين
/*
أي انه اذا تم استدعاء الملف ولم يكن مستعدي من قبل يتم تعريفه و العكس صحيح
اظنني ذكرت بما فيه الكفايه ولك ان تسال وتبحث
نحن موجودون
لغتي سخيفه ؟
السلام عليكم ورحمة الله وبركاته :
اهداء خاص ل ابو عبد الرحمن :
ماهي ال The PREPROCESSOR هي عباره عن برنامج ملحق بمترج اللغه(the compiler) تستقبل الشفره المصدريه للبرنامج (source code) وتقول بتحليلها وتحيل ال PREPROCESSOR directives بها
دعنا لا ننسي انها جزي من المترجم وايضا لاحظ انها تعمل سطر سطر وليس ك structure او منشاه
لنبدا

كود PHP:
#include
كود PHP:
#include
قد تتسال في يوم من االايام ماالفرق بين
كود PHP:
#include <file.h>
كود PHP:
#include "file.h"
بينا الاخري تخبر المترجم بان هذا الملف قد يكون موجود بداخل مجلد البرنامج او قد يكون في مجلد اساسي لذلك يقوم المترجم بالبحث
#define
مهي وظيفة هذا ال directive وظيفته بالتحديد هي تحديد ثوابت او ماكروز لدوال او ثوابت عاديه
راعي انه هناك طريقتان طريقه للدوال وطريقه لغير الدوال
مثلا
كود PHP:
#define PF www.programming-freaks.net
أي مكان في البرنامج؟ اجل : حقيقة انا اكذب أي مكان عدا بين " " في هذه الحاله تعتبر سلسله نصيه وليس اكثر
ليس هذا فقط بي يمكنك عمل ماكرو لداله ايضا مثلا
كود PHP:
#define SAY_HAY(val) printf(#val);
كود PHP:
#define SAY_HAY(val) printf("%s",val);
وبما ان استدعاء ذلك المكرو سوف يوقم باستبدال مابعد تعريفه
وبما ان انه يمكن استبدال val ب argument اخر
اذن
كود PHP:
SAY_HAY("Storm"); = printf("\"storm\"");
حسنا
كود PHP:
Val="Storm"
في هذه الحاله بدون stringizing operator (#) سوف تكون الطباعه هذا
كود PHP:
Printf(""storm"");
syntax error before "Storm"
لماذا هذا لانك قيم بطاعة "" داخل "" بدون استخدام \ ك escape sequence أي انه يفقد مابعده قيمته الخاصه لان "" لها قيمه خاصه بانها بادئات وناهيات السلاسل النصيه
اذن مافائدة # فائداتها هو منع حدوث ذلك اذا تم ارسال "storm" لها سوف تقوم بمعالجتها وجعلها
\"Storm\"
أي انه يمكنك طباعتا
اظن ان الثانيه مفهومه جدا
اذن فكل مابعد #define يتم استبادله بقيمته النصبه في البرنامج
كود PHP:
#undef
مثلا عندما تقوم بكتباة برنامج وتقوم بعمل مكتبات خاصه بك تستخدم هذه لمنع حدوث احتواء مكتبه مرتين لان ذلك يسبب اخطاء"
من ذلك لاحقا
كود PHP:
#if
#ifdef
#ifndef
#else
#elif
#endif
#error
في بعض الاحيان تقوم بكتابة كود لكي يعمل علي نظام وتقوم بكتابة نفس الكود مره اخري ليعم علي نظام اخر
هذا الاشياء تساعد كثيرا
دعنا نبدا ب #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 يمكنها ذلك
مثلا
كود 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
لن اتكلم مجددا راجع ال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
./file
Output :NORMAL MODE
Gcc –Wall –ansi file.c –o file
./file
Output: #error you don't ask for compiling process
لان #error اذا ظهرت تمنع عمل ترجمه للبرنامج مع وجود رساله
حسنا يمكن أي ايضا استخدامها لمنع حدوث احتواء مرتين
/*
كود PHP:
header.c*/
#ifndef _HEADER_H
#define _HEADER_H
/* header code goes here*/
#endif
اظنني ذكرت بما فيه الكفايه ولك ان تسال وتبحث
نحن موجودون
لغتي سخيفه ؟
تعليق