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

ما علاقة ملف الهيدر مع ملف ال cpp

مغلق
بدأه docesam في 29 أبريل 2005 · 9 رد · 1,924 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

عملت مشروع جديد في ال dec-c++ مكون من ثلاث ملفات :

الملف الأول : main.cpp

#include <iostream>

#include "display.h"

using namespace std;


int main()
{

int mine;
cout <<"enter any number ";
cin >>mine; 
display(mine);


    system("PAUSE");
    return 0;
}

والثاني : display.h

void display(int myint);

والثالث : display.cpp

#include "display.h"
#include <iostream>
using namespace std;

void display(int myint)
{
     
cout <<"you typed " <<  myint << endl;

}

وضعتهم في نفس المجلد وعملت كومبايل و بلد واشتغل البرنامج : سؤالي هو :

1- ما الذي يربط ملف display.h مع display.cpp هل لأن لهما نفس اسم الملف ، أم لأنهما موجودان معاً في نفس المشروع (مع العلم أني استعمل dev-c++ )

يعني كيف يعرف الكومبايلر أن الفنكشن display موجودة في الملف display.cpp وليس في ملف آخر

؟

شكراً لكم مقدماً

#2

لانك ربطت الملفين ب INCLUDE

#include "display.h"

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

جميل جداً : أنا ربطت الملف الرئيسي ب display.h وليس ب display.cpp

ما الذي يربط display.cpp مع الملف الرئيسي ؟

تم تعديل هذه المشاركة بواسطة docesam في 30 أبريل 2005 في 19:23

#4

الرابط Linker

هو المسؤول عن الربط و ليس ال Compiler.

#5
ib_doom كتب:
الرابط Linker

هو المسؤول عن الربط و ليس ال Compiler.

وكيف يعف الرابط أن الملف display.cpp هو المطلوب ؟

#6

عملية الـ compilation تمر بمرحلتين, الاولة تحويل ملفات الـ .cpp الى .o و ملفات الـ .o هي ملفات مكتوبة بلغة الآلة لكنها ناقصة .. عادة يكون فيها نداءات الى functions معرفة في أماكن أخرى, و لكن الكومبايلر (او الـ assembler) لا يعرف عناوين هذه الـ functions لذلك يتركها فارغة ..

ثم تأتي الخطوة التالية و هي أخذ ملفات الـ .o و ربطها ببعضها, يعني ملء الفراغات و ضع كل شي في ملف واحد .exe

بالنسبة للـ .h فهي بصراحة من الأمور المتخلفة في الـ ++C حيث فائدتها الوحيدة هي اخبار الكومبايلر بأن هذا الفنكشن موجود في مكان آخر ..

المشكلة في السي بلص بلص ان الكةمبايلر يجب ان يعرف بوجود الفنكشن قبل ان يسمح لك باستخدامه, لذلك فهذا الكود لن يعمل:

int main()
{
    doStuff();

    return 0;
}

void doStuff()
{
    cout << "hello" << endl;
}

رغم أن doStuff موجود في هذا الملف, لكن الكومبايلر يمشي على الكود من فوق الى تحت, و عندما يكون في main فهو لم يمر على doStuff بعد, لذلك فهو لا يعلم بوجودها .. و لن يسمح لك باستخدامها الا اذا اخبرته صراحة ان هذا الفنكشن موجود:

void doStuff(); //declaration

int main()
{
    doStuff();

    return 0;
}

void doStuff()
{
    cout << "hello" << endl;
}

كل ما في الأمر انك تقول للكوبمايلر: اعرف انك لم تر هذا الفنكشن بعد, و لكن لا تقلق, هذا الفنكشن موجود في مكان آخر!!

هذه هي الفائدة الوحيدة من ملفات الـ .h و هي اخبار الكومبايلر بان الفنكشن موجود حتى و ان لم يسمع به.

اما كيف يعرف اين هذا الفنكشن؟ فهو لا يعرف ..

و لكن عندما تعمل كومبايل للبروجكت, فإن الكومبايلر سوف يقوم بترجمة جميع ملفات الـ .cpp الى ملفات .o ثم يقوم بربط ملفات الـ .o مع بعضها و ايضا يربطها بالـ libraries المعروفة لديه.

و هنا تتم عملية اكتشاف "اين يوجد هذا الفنكشن"

و اذا واجه اللنكر مشكلة في هذه النقطة, فستظهر رسالة خطأ غريبة نوعا ما .. مليئة بالرموز.

يعني ممكن جدا انك تصرح فنكشن و تستخدمه دون ان تعرفه, و لن يكتشف الكومبايلر هذا الخطأ بل سيكتشفه اللنكر linker.

جرب ان تفعل ذلك لترى نوعية الرسالة اللتي ستراها.

#8

شكراً لكم في الواقع ما قصرتم

كيب سؤال ثاني (أعرف طولت عليكم )

قرأت في مواقع كثيرة أن عمل include لملف ال cpp شيئ غير مستحب أبداً وأنك لابد أن تعمل انكليود لملف ال .h فقط

لماذا ؟ ما االمشكلة في عمل انكليود لملف ال cpp ؟؟؟

#9

أولا لأن الفكرة من الـ include هو مجرد macro لعدم تكرار الـ declarations, لذلك لا يوجد معنى لعمل include للـ .cpp (حسب ما أظن)

و ثانيا لانك عندما تعمل include فهذا الانكلود يحدث عدة مرات (لانه يحصل في عدة فايلات) .. و هذا يجعله لا يصلح لشيء الا للـ declaration و هذه الأشياء .. صحيح ان هناك محددات تجعل الكود لا ينفذ الا مرة واحدة مثل

#pragma once

او

 
#ifndef FILE_H
#define FILE_H

.....

#endif

و لكن لأسباب خارج نطاق علمي, لا تزال هناك حدود لما تستطيع فعله ..

لا تستطيع ان تصرح بمتغير او object داخل ملف .h .. ستحصل على linker error لا اعرف سببه بالظبط ..

و لكن عادة في ملفات الـ .cpp نكتب الكثير من الأشياء .. و لكن قد بعضها لا يصلح عمل include له

لا ادري اذا كانت الفكرة غير واضحة .. هي عموما غير واضحة عندي أصلا!

#10

شكراً لك على كل حال

هذا الموضوع مغلق.

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