ParsX.com
پذیرش پروژه از دانشجویی ... تا سازمانی 09376225339
 
   ProfileProfile   Log in to check your private messagesLog in to check your private messages  |  FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups Log inLog in   RegisterRegister 

هدرها و دستورات پيش پردازنده #include PreProcessors

 
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming
View previous topic :: View next topic  
Author Message
vahid
بي تو هرگز


Joined: 26 Nov 2004
Posts: 3067
Location: Tehran

PostPosted: Tue Feb 07, 2006 4:24 pm    Post subject: هدرها و دستورات پيش پردازنده #include PreProcessors Reply with quote

خطي كه با # شروع ميشود يك دستور پيش پردازنده اي ميباشد . كه قبل و بعد از اين علامت هر مقدار space يا tab ميتواند باشد .
اگر در خطي فقط # قرار داده شود آنگاه آن خط بصورت يك خط null فرض ميشود و كامپايلر آنرا حذف ميكند .
اگر هر خطي از هدر شما در يك خط جا نشد ميتوانيد بكمك كاراكتر \ آن خط را بشكنيد بدون كه با پيام خطا مواجه شويد .
#define MacroName  "parsx \
.h"

اين علامت براي تمامي دستورات زبان C ظاهرا اجرايي است بشرطي كه بلافاصله بعد ازاستفاده از كاراكتر \ (backslash) از كاراكتر( (newline يا همان كليد اينتر استفاده كنيد . اين يعني حتي در صورت استفاده از كاراكترهاي space و tab با خطا مواجه ميشويد .
به سه طريق ميتوان يك هدر فايل را در برنامه include كرد

#include <header_name>
#include "header_name"
#include macro_identifier

نمونه اين include كردن ها را در فايلهايي مانند stdio.h و conio.h ديده ايد .
راهنماي include# ، سورس كدي كه در فايل ديگري ميباشد را در برنامه مي آورد . اين فايلها به سه نام include files , header files يا headers شناخته ميشوند . اين دستور به سه روش استفاده ميشود :
• در دو روش اول از ماكرو ها استفاده نميشود . به معناي ديگر header_name به عنوان يك ماكرو شناسايي نميشود . اين header_name بايد يك نام فايل DOS استاندارد بهمراه پسوند آن كه معمولا .h ميباشد است(مثل : stdio.h) در ضمن در اين قسمت ميتوان مسير فايل را نيز بصورت اختياري مشخص كرد . در روش اول نام فايل بين علامتهاي بزرگتر و كوچكتر قرار ميگيرد : <stdio.h> ولي در روش دوم نام فايل بين دو دابل كوتيشن قرار ميگيرد . "stdioMe.h"
• در روش سوم هيچ يك از " و < قبل و بعد از نام ماكرو نمي آيند بلكه در جايي كه قبلا ماكرو تعريف شده است از اين علامتها بنا به نياز استفاده شده است مثل :
#define PARSX "mehdi.h"
#include PARSX

در واقع پس از include# كردن پيش پردازنده اين خط را حذف ميكند و تمامي متن آن فايلي كه اينكلود شده است را به جاي اين خط قرار ميدهد .
در حالتيكه نام فايل شما بين دو علامت كوچكتر و بزرگتر باشد <filename.h> بدنبال فايل include شده در شاخه اي كه فايلهاي Include بصورت پيشفرض قرار دارند جستجو ميشود و اگر چيزي پيدا نشد پيام خطا صادر ميشود و در حالتيكه نام فايل بين دو دابل كوتيشن قرار بگيرد "filename.h" معمولا ابتدا در آن شاخه اي كه سورس كد شما قرار دارد بدنبال اين فايل ميگردد و اگر آنرا پيدا نكرد به دايركتوري پيشفرضي كه فايلهاي include در آنجا قرا دارند ميرود . در حالتيكه مسير را پشت نام فايل مشخص كنيد آنگاه تنها همان فايل جستجو ميشود .

#define myinclude "c:\parsx\c.h"
#include myinclude

مثال زير را ببينيد :
#ifdef DEBUG1
   #define MY_HEADER "myProject_dbg.h"
#else
   #define MY_HEADER "myProject.h"
#endif
#include MY_HEADER

در كدفوق پيش پردازنده يا preoprocessor كامپايلر چك ميكند كه آيا ماكروي DEBUG1 مقداري داشته است يا خير اگر داشته است MY_HEADER را myProject_dbg.h قرار ميدهد وگرنه myProject.h به MY_HEADER نسبت داده ميشود .
در هدرفايلهايي كه بصورت <filename> تعريف ميشوند پيش پردازنده معمولا در سيستم هاي يونيكس در شاخه هاي /usr/local/include و /usr/include جستجو ميكند .
اين #include ها ميتوانند بصورت تو در تو نيز استفاده شوند فرضا اگر هدرفايلي را Include كنيد كه در خودش فايل ديگري را Include كرده باشد كدهاي آن فايل هم به اين فايل شما پيوست شده است . پيش پردازنده تا 15 مرحله ميتواند به Include هاي تو در تو پاسخ دهد . به بيان ديگر 15 هدرفايل ميتوانند در هم Include شوند . در هر صورت امكان دارد فايلهاي تكراري Include‌شوند مثلا اگر در هدرفايل myProject.h فايل stdio.h يكبار Include شده باشد و ما بترتيب زير فايلها را Include با مشكل زير روبرو خواهيم شد :
#include <stdio.h>
#include "myProject.h"

كه تكرار كد در آن ديده ميشود . بنابراين ميتوان بكمك شرطهايي در سرآيند ها از اين اشتباه جلوگيري كرد :
#ifndef INCFILE_H_
#define INCFILE_H_
/* contents of header  */
#endif

در اين مرحله براي بار اول INCCFILE_H_ مشخص نشده است بنابراين وارد دستور شرطي ميشود اما براي مراحل بعدي چون اين هدرفايل مشخص شده است ديگر وارد شرط نميشود .
هدرفايلها شامل function prototypes و تعاريف ماكروها و تعيين انواع ميباشند .
نكته :
#include <STdio.H>
#include <stdio.h>
#include <sTdIo.H>

نام فايلهاي Include شده بسته به نوع سيستم عامل شما به حروف حساس هستند يا نيستند و ربطي به كامپايلر شما ندارد . اگر از سيستم عامل داس استفاده ميكنيد اين نام فايلها همگي يكي است و اگر از unix اين نامها متفاوت خواهند بود .
اگر سهوا دو بار فايل stdio.h را Include كنيد مشكلي در كامپايل برنامه پيش نمي آيد . و فقط تعداد خطوط برنامه افزايش ميابد .


Last edited by vahid on Wed Feb 08, 2006 9:01 am; edited 3 times in total
Back to top
vahid
بي تو هرگز


Joined: 26 Nov 2004
Posts: 3067
Location: Tehran

PostPosted: Tue Feb 07, 2006 4:24 pm    Post subject: Reply with quote

در ضمن در چاپ چهارم كتاب زبان C اقاي مقسمي صفحه 10 در مورد اين موضوع آمده است :
"اگر نام فايل در <> باشد ابتدا مسيرهاي تعيين شده در سيستم جستجو ميگردند و اگر فايل پيدا نشد . آنگاه فهرست جاري جستجو ميشود . " (مقسمي ‍10 ‍ 82)
كه قسمت دوم اين جمله غلط است چراكه در صورتيكه فايل پيدا نشود آنگاه پيام خطا ارسال ميشود و كامپايلر متوقف ميشود . در نتيجه ادامه اين جمله بصورت : " معمولا بهتر است هدر فايلهايي را كه كاربر مينويسد داخل "" و ... " غلط است چراكه كاربر در صورت استفاده از <> انتخابي براي آنكه هدرفايل مورد نظرش را در مسيري غير از دايركتوري Include قرار دهد ندارد.
Back to top
Display posts from previous:   
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming All times are GMT + 3.5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum