PDA

View Full Version : مبتدی: تفاوت namespace , lib و Header File



MustafaJF
پنج شنبه 14 اردیبهشت 1391, 12:43 عصر
یک پرسش خیلی ابتدایی دارم ولی برای من خیلی مهمه
من چند روزیه که برنامه نویسی با سی پلاس پلاس توی محیط گنو رو شروع کردم و یه سوال برام پیش اومده
توی C# فقط namespaceها وجود داشتن و بصورت سلسله مرتبی و تودرتو بودن ولی توی سی پلاس علاوه بر namespaceها فایلهای سرآیند و کتابخانه ها هم هستند آیا وجود فایلهای سرآیند تنها برای حفظ سازگاری با سی هستش و یا اینکه یکی از اجزای جدایی ناپذیر سی پلاس و اینکه آیا فضاهای نام و کتابخانه ها یکی هستند

mehdi.mousavi
پنج شنبه 14 اردیبهشت 1391, 18:01 عصر
یک پرسش خیلی ابتدایی دارم ولی برای من خیلی مهمه من چند روزیه که برنامه نویسی با سی پلاس پلاس توی محیط گنو رو شروع کردم و یه سوال برام پیش اومده توی C#‎‎ فقط namespaceها وجود داشتن و بصورت سلسله مرتبی و تودرتو بودن ولی توی سی پلاس علاوه بر namespaceها فایلهای سرآیند و کتابخانه ها هم هستند آیا وجود فایلهای سرآیند تنها برای حفظ سازگاری با سی هستش و یا اینکه یکی از اجزای جدایی ناپذیر سی پلاس و اینکه آیا فضاهای نام و کتابخانه ها یکی هستند

سلام.
به برنامه نویس خوش آمدید. :) لطفا قبل از شروع فعالیت در سایت، از مطالعه قوانین سایت اطمینان حاصل کنید.

اما در مورد سوالتون، من قبلا Namespace رو اینجا تعریف کرده ام (http://barnamenevis.org/showthread.php?283540-namespace-%DA%86%DB%8C%D8%B3%D8%AA-%D9%88-%D8%A8%D9%87-%DA%86%D9%87-%D8%AF%D8%B1%D8%AF%DB%8C-%D9%85%DB%8C%D8%AE%D9%88%D8%B1%D8%AF%21%D8%9F&p=1252412&viewfull=1#post1252412). بنابراین Header File ها و Library ها رو براتون تعریف می کنم. اما قبل از تعریف header file ها، اجازه بدید تا ابتدا با معنای declare کردن آشنا بشیم. برای فراخوانی یک تابع، ابتدا باید Signature اونو در Source File خودمون قرار بدیم. اگر قرار باشه یک تابع از N جا Call بشه، اونوقت این تعریف باید در N نقطه صورت بگیره، که پر واضحه کاری بیهوده و وقت گیر هستش. پس، میاییم این تعریف رو در فایلی به نام Header File قرار میدیم و به Compiler میگیم که تعاریف موجود در فلان Header File رو در این Source File نیاز دارم (این گفتن توسط include انجام میشه و به این عمل میگن declare کردن). وقتی اینکار انجام بشه، دیگه Compiler مات و مبهوت نمیمونه که Signature فلان تابعی که فراخوانی شده چی هستش، چون شما اونو قبلا Declare کرده اید.

اما حالا پیاده سازی همون تابع، میتونه در یک Source File دیگه باشه که خود این Source File میتونه در یک Library جداگانه قرار داشته باشه. Library چیه؟ پیاده سازی توابعی است که مایلید اونها رو از چند برنامه فراخوانی کنید. فرض کنید، برنامه ای نوشته ایم که توانایی محاسبه عملیات شگفت انگیری رو داره و به یکباره دنیا متوجه کار برجسته ای که انجام داده ایم میشه و همه درخواست میکنن که پیاده سازی این توابع شگفت انگیز رو در اختیار اونها هم قرار بدیم تا اونها هم بخشی از مشکلات عالم رو با فراخوانی توابع نوشته شده توسط ما، حل کنند.

در این لحظه، آستین ها رو به سرعت بالا میزنیم و پیاده سازی توابعی که نوشته بودیم رو به یک فایل مجزا منتقل می کنیم (به خروجی تولید شده از این پیاده سازی ها که عموما فایل با خروجی dll یا lib هستش، Library میگیم). بعدش، برای اینکه برنامه نویس ها سردرگم نشن، Header File ای هم میسازیم و Signature توابع موجود در اون DLL/LIB رو در اون قرار میدیم. حالا، میتونیم این DLL/LIB رو بهمراه اون Header File به دست علاقمندان بدیم تا اونها،


Header File رو در برنامه اشون include کنن،
DLL/LIB رو هم به برنامه اشون Link کنن (که اگر نکنن، Linker با خطا مواجه میشه و ازمون میپرسه "پس پیاده سازی توابعی که declare کرده بودی کو؟")

و توابع شگفت انگیز ما رو Call کنن و ازش لذت ببرن. به این فایل DLL/LIB میگیم Library. با اینکار، ما Library (یا کتابخانه ای) برای انجام عملیات شگفت انگیز طراحی کردیم، حالا می تونیم اونو N بار در N پروژه بدون دست کاری یا Compile استفاده کنیم. :)

موفق باشید.

MustafaJF
پنج شنبه 14 اردیبهشت 1391, 21:05 عصر
ممنون از راهنماییتون فقط درباره فضاهای نام یه سوال برام پیش اومده
namespaceها یعنی فقط برای دسته بندی دستورات بکار میرن
و این دستورات فقط دستورات سی پلاس هستند که معمولا وابسته به پلتفورم مورد استفاده می باشند (گنو باید std فراخوانی بشه و در ویندوز نه)
و یا اینکه نه namespace چیزی فراتر از دسته بندی دستوراته

one hacker alone
پنج شنبه 14 اردیبهشت 1391, 22:51 عصر
سلام.
به برنامه نویس خوش آمدید. :) لطفا قبل از شروع فعالیت در سایت، از مطالعه قوانین سایت اطمینان حاصل کنید.

اما در مورد سوالتون، من قبلا Namespace رو اینجا تعریف کرده ام (http://barnamenevis.org/showthread.php?283540-namespace-%DA%86%DB%8C%D8%B3%D8%AA-%D9%88-%D8%A8%D9%87-%DA%86%D9%87-%D8%AF%D8%B1%D8%AF%DB%8C-%D9%85%DB%8C%D8%AE%D9%88%D8%B1%D8%AF%21%D8%9F&p=1252412&viewfull=1#post1252412). بنابراین Header File ها و Library ها رو براتون تعریف می کنم. اما قبل از تعریف header file ها، اجازه بدید تا ابتدا با معنای declare کردن آشنا بشیم. برای فراخوانی یک تابع، ابتدا باید Signature اونو در Source File خودمون قرار بدیم. اگر قرار باشه یک تابع از N جا Call بشه، اونوقت این تعریف باید در N نقطه صورت بگیره، که پر واضحه کاری بیهوده و وقت گیر هستش. پس، میاییم این تعریف رو در فایلی به نام Header File قرار میدیم و به Compiler میگیم که تعاریف موجود در فلان Header File رو در این Source File نیاز دارم (این گفتن توسط include انجام میشه و به این عمل میگن declare کردن). وقتی اینکار انجام بشه، دیگه Compiler مات و مبهوت نمیمونه که Signature فلان تابعی که فراخوانی شده چی هستش، چون شما اونو قبلا Declare کرده اید.

اما حالا پیاده سازی همون تابع، میتونه در یک Source File دیگه باشه که خود این Source File میتونه در یک Library جداگانه قرار داشته باشه. Library چیه؟ پیاده سازی توابعی است که مایلید اونها رو از چند برنامه فراخوانی کنید. فرض کنید، برنامه ای نوشته ایم که توانایی محاسبه عملیات شگفت انگیری رو داره و به یکباره دنیا متوجه کار برجسته ای که انجام داده ایم میشه و همه درخواست میکنن که پیاده سازی این توابع شگفت انگیز رو در اختیار اونها هم قرار بدیم تا اونها هم بخشی از مشکلات عالم رو با فراخوانی توابع نوشته شده توسط ما، حل کنند.

در این لحظه، آستین ها رو به سرعت بالا میزنیم و پیاده سازی توابعی که نوشته بودیم رو به یک فایل مجزا منتقل می کنیم (به خروجی تولید شده از این پیاده سازی ها که عموما فایل با خروجی dll یا lib هستش، Library میگیم). بعدش، برای اینکه برنامه نویس ها سردرگم نشن، Header File ای هم میسازیم و Signature توابع موجود در اون DLL/LIB رو در اون قرار میدیم. حالا، میتونیم این DLL/LIB رو بهمراه اون Header File به دست علاقمندان بدیم تا اونها،



Header File رو در برنامه اشون include کنن،
DLL/LIB رو هم به برنامه اشون Link کنن (که اگر نکنن، Linker با خطا مواجه میشه و ازمون میپرسه "پس پیاده سازی توابعی که declare کرده بودی کو؟")


و توابع شگفت انگیز ما رو Call کنن و ازش لذت ببرن. به این فایل DLL/LIB میگیم Library. با اینکار، ما Library (یا کتابخانه ای) برای انجام عملیات شگفت انگیز طراحی کردیم، حالا می تونیم اونو N بار در N پروژه بدون دست کاری یا Compile استفاده کنیم. :)

موفق باشید.


ممنون از راهنماییتون
در مورد lib سوالی که پیش میاد اینه که خوب ما توی اون یه سری توابع برای انجام برخی کارها تعریف میکنیم خوب چه کاریه وقتی میتونیم توی هدر فایل تعریف کنیم؟
من هنوز نقش lib رو متوجه نشدم

tajerman
دوشنبه 15 آبان 1391, 12:48 عصر
ممنون از راهنماییتون
در مورد lib سوالی که پیش میاد اینه که خوب ما توی اون یه سری توابع برای انجام برخی کارها تعریف میکنیم خوب چه کاریه وقتی میتونیم توی هدر فایل تعریف کنیم؟
من هنوز نقش lib رو متوجه نشدم
با سلام
من هم هنوز فرق کتابخانه با فایل هدر رو خوب متوجه نشدم ؟
مگه نمیشه همه این کارایی که گفته شد توی فایل هدر انجام بشه ؟ پس کار این کتابخانه این وسط چیه ؟

omidshaman
دوشنبه 15 آبان 1391, 21:25 عصر
خوب توضیح دادن دیگه فقط اسم اون فانکشن ها و نحوه وارد کردن ورودی بصورت طبقه بندی شده داخل فایل هدره ولی کد اصلیشون که چجوری عمل کنن داخل همون کتابخانست
که خوب این جدا کردن باعث میشه راحت تر یک برنامه نویس بفهمه داخل هر کتابخانه چه عملکردهایی است مثلا اگر خود کتابخانه1میلیون خط باشه هدرش 1000 خطه تو 1000 خط گشتن و کسب کردن اطلاعات درباره یک فانکشن خیلی راحت تره دیگه نه؟
مثلا این هدر studio.h رو نگاه کن شما اگر بخواینحوه وارد کردن متن رو بفهمی کافیه داخلش سیرچ کنی Input! بعد خیلی راحت میتونی همه فانکشن ها برای ورود متن رو به همراه نحوه وارد کردنشون ببینی!
http://omidshaman.persiangig.com/standard%20headers.h

Ananas
سه شنبه 16 آبان 1391, 14:54 عصر
بله یک دلیل مهمش هم اینه که فرمول بکار رفته در این (به قول آفای موسوی:) توابع شگفت انگیزتون به دست افراد نمی افته و افراد فقط می تونن با صدا زدن توابعی که شما تو هدر فایل نوشتین از این محاسبات شگفت انگیز شما استفاده کنن و نمیتونن اون رو به دلخواه خودشون تغییر بدن و یا به شکل دیگه ای استفاده (و یا به نفع خودشون سوء استفاده) کنن.