سؤال

أنا مرتبك بعض الشيء.ما الفرق بين الإعلان الأمامي والمرجع الأمامي؟الإعلان الأمامي هو، في ذهني، عندما تعلن عن وظيفة لم يتم تنفيذها بعد، ولكن هل هذا غير صحيح؟هل يجب عليك إلقاء نظرة على الموقف المحدد إما للإعلان عن حالة "مرجع أمامي" أو "إعلان أمامي"؟

هل كانت مفيدة؟

المحلول

ويكيبيديا :

<اقتباس فقرة>   

الإعلان إلى الأمام

     

وإعلان متغير أو وظيفة التي لا تحدد بعد. ويمكن رؤية defnition في وقت لاحق يوم.

     

إلى الأمام المرجعي

     

وعلى غرار الإعلان إلى الأمام ولكن حيث يظهر متغير أو وظيفة أولا تعريف هو أيضا في المكان.

نصائح أخرى

أ إعلان إلى الأمام هو إعلان عن طريقة أو متغير قبل تنفيذه واستخدامه.الغرض من الإعلانات الأمامية هو توفير وقت الترجمة.

يؤدي الإعلان الأمامي للمتغير إلى تخصيص مساحة تخزين جانبًا، حتى تتمكن لاحقًا من تعيين قيمة هذا المتغير.

يُطلق على التصريح الأمامي للدالة أيضًا اسم "النموذج الأولي للدالة"، وهو عبارة عن بيان إعلان يخبر المترجم عن نوع إرجاع الدالة، واسم الدالة، وأنواع معلماتها.يقوم المترجمون بلغات مثل C/C++ وPascal بتخزين الرموز المعلنة (التي تتضمن وظائف) في جدول البحث والإشارة إليها عند ظهورها في التعليمات البرمجية الخاصة بك.تقرأ هذه المترجمات التعليمات البرمجية الخاصة بك بشكل تسلسلي، أي من أعلى إلى أسفل، لذلك إذا لم تقم بإعادة توجيه التصريح، يكتشف المترجم رمزًا لا يمكنه الرجوع إليه في جدول البحث، ويثير خطأ لا يعرفه كيفية الرد على الدالة.

يعد الإعلان الأمامي بمثابة تلميح للمترجم بأنك قمت بتعريف (ملء تنفيذ) الوظيفة في مكان آخر.

على سبيل المثال:

int first(int x); // forward declaration of first

...

int first(int x) {
   if (x == 0) return 1;
   else return 2;
}

لكن، قد تسأل، لماذا لا نطلب من المترجم إجراء تمريرتين على كل ملف مصدر:الأول لفهرسة جميع الرموز الموجودة بداخله، والثاني لتحليل المراجع والبحث عنها؟وفقًا لقصة دان:

عندما تم إنشاء C في عام 1972 ، كانت موارد الحوسبة أكثر ندرة وعلى علاوة عالية - الذاكرة المطلوبة لتخزين الجدول الرمزي الكامل للبرنامج المعقد في وقت واحد ببساطة لم تكن متوفرة في معظم الأنظمة.كان التخزين الثابت مكلفًا أيضًا وبطيئًا للغاية ، لذا فإن الأفكار مثل الذاكرة الافتراضية أو تخزين أجزاء من الجدول الرمزي على القرص لم تكن لتوحيد التجميع في إطار زمني معقول ...عندما تتعامل مع الشريط المغناطيسي حيث تم قياس أوقات البحث في ثوان وتم قياس الإنتاجية بالبايت في الثانية (وليس كيلوبايت أو ميغابايت) ، كان ذلك ذا معنى إلى حد كبير.

تم تعريف C ++ ، على الرغم من تم إنشاؤه بعد 17 عامًا تقريبًا ، على أنه مجموعة من C ، وبالتالي اضطرت إلى استخدام نفس الآلية.

بحلول الوقت الذي كانت فيه جافا موجودة في عام 1995 ، كان لدى أجهزة الكمبيوتر المتوسطة ذاكرة كافية كانت تحمل طاولة رمزية ، حتى بالنسبة لمشروع معقد ، لم يعد عبئًا كبيرًا.ولم تكن Java مصممة لتكون متوافقة مع C ، لذلك لم يكن لديها حاجة لتبني آلية قديمة.كان C # غير مرتبط بالمثل.

ونتيجة لذلك ، اختار مصمموهم تغيير عبء الإعلان الرمزي المباشر عن المبرمج ووضعه على الكمبيوتر مرة أخرى ، لأن تكلفته بما يتناسب مع الجهد الكلي للتجميع كانت ضئيلة.

في Java وC#، يتم التعرف على المعرفات تلقائيًا من الملفات المصدر وقراءتها مباشرةً من رموز المكتبة الديناميكية.في هذه اللغات، ليست هناك حاجة إلى ملفات الرأس لنفس السبب.

أ إشارة إلى الأمام هو العكس.يشير إلى استخدام الكيان قبل إعلانه.على سبيل المثال:

int first(int x) {
   if (x == 0) return 1;
   return second(x-1); // forward reference to second
}

int second(int x) {
   if (x == 0) return 0;
   return first(x-1);
}

لاحظ أن "المرجع الأمامي" يُستخدم أحيانًا، ولكن بشكل أقل، كمرادف لـ "الإعلان الأمامي".

وتستخدم الإعلانات إلى الأمام للسماح للمرور واحد تجميع لغة (C، باسكال).

وإذا سمح يشير إلى الأمام دون إعلان الأمام (جافا، C #)، مطلوب مترجم بتمريرين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top