اطلاعیه

Collapse
No announcement yet.

define# یعنی چی؟

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    define# یعنی چی؟

    سلام و با تشکر از این که به این تاپیک توجه می کنین .
    به ما تو دانشگاه ++c یاد دادن ولی هیچ چی در مورد دستوراتی مانند define , ifdef , endif,undef,elif و... نگفتن . نمی دونم این دستورات تو c ی یا این که تو ++c هم هست و به ما نگفتن ؟ به هر حال این دستورات رو زیاد تو برنامه های میکرو می بینم و چیزی ازش نمی دونم .ممنون میشم در مورد این دستورات توضیح بدین .اگه مثال هم بزنین بیشتر ممنون میشم .
    الهی خیر از جوانیتون ببینین :cry2:
    ای با من و پنهان چو دل از دل سلامت میکنم توکعبه ای هر جا روم قصد مقامت می کنم
    هر جا که هستی حاضری از دور در ما نا ظری شب خانه روشن میشود چون یاد نامت میکنم
    گه همچو باز آشنا بر دست تو پر میزنم گه چون کبوتر پرزنان آهنگ بامت می کنم

    مرا گویی تورا با این قفس چیست من چه دانم ، من چه دانم اگر مرغ هوایی این قفس چیست من چه دانم ، من چه دانم من چه دانم

    #2
    پاسخ : define# یعنی چی؟

    سلام
    خب به این عبارات دقت کن:
    define==define
    ifdef==if defined
    ifndef==if not defined
    endif==end if
    undef==undefine
    elif==else if
    درسته؟
    خب به این دستورات که همه شون هم با # شروع میشن میگن preprocessor یا پیش پردازنده. به این معنی که به همه ی این دستورات قبل از شروع کامپایل پرداخته میشه (precompile binding)
    خب دستور define برا معرفی یه ثابت پیش پردازنده هست. مثلا فرمان زیر

    #define A B

    متغیر پیش پردازنده ی A رو بعنوان جایگزینی برا B معرفی میکنه. یعنی قبل ازکامپایل هر جا که A رو دید B رو بصورت فیزیکی و همونطور که هست جایگزین A میکنه.
    لازم به کره که B میتونه یه عبارت هم باشه.
    خب بگذریم. بقیه به طریقی از همین مفهوم استفاده میکنن

    مثلا undef باعث میشه از اونجایی که نوشته شده به بعد دیگه جاگزینی A با عیارت B صورت نگیره که به طریقی معادل مفهوم از حالت تعریف خارج کردن A هست.

    مفهوم ifdef A هم اینه که اگه A در مکانی که الان در حال استفاده از ifdef هستیم تعریف شده هست ، جواب مثبته و تمام خطوط بعد از ifdef تا endif  مربوط به اون که میتونه چندین خط پایین تر باشه باید اجرا بشن و اگه A تعریف شده نبود فرامین بین ifdef و endif اجرا نشن .  مثلا

    #ifdef A
    commands....
    #endif

    دقت کن که این if های پیش پردازنده مثل همون if هایی که در ساختار دستورات C و C++ قرار دارن از قوانین تودرتو بودن پیروی میکنن.
    خب فرمان ifndef همونطور که از معنیش معلومه عمل عکس ifdef رو  انجام میده.
    elif هم میتونه مابین ifdef و endif یا ifndef و endif قرار بگیره و کار else if رو میکنه که کاملا معلومه. مثلا

    #ifdef A
    commands...
    #elif (index==12)
    commands...
    #endif


    مشابه حالت فوق هم برای ifndef قابل قبوله.

    فقط دقت داشته باش که دو فرمان فوق با هم برابرند :
    #ifdef A
    #if defined A

    دقت کن که این فرامین رو سرعت اجرا تاثیری ندارن. چون binding اونا قبل از کامپایله.

    خب حالا بریم سراغ چیزی که شما دیدی.
    شما احتمالا این حالتو دیدی:

    #ifndef C
    #define C
    commands...
    #endif


    خب به این حالت دقت کن. میگه اگه C تعریف شده نبود تعریفش کن و این فرامینو انجام بده، وگرنه اگه تعریف شده بود نمی خواد این فرمانا رو انجام بدی. درسته؟
    خب از همین مفهوم معلومه که هدف این  بوده که این فرامین فقط یه بار اجرا شن و حتی بصورت اتفاقی هم چند بار اجرا نشن.
    خب این حالت تو فایل های هدر کامپایلر C++ هم وجود داره . چون ممکنه شما اتفاقی تو دو جای برنامه اون فایل هدر رو include کرده باشین که مسلما زمان کامپایل ارور میده ، ولی این حالت باعث میشه در دفعات بعدی include یه فایل هدر فرامین داخل بلوک ifndef نادیده گرفته شن تا از بروز خطا جلوگیری شه.

    تو میکرو هم یه هدف مشابهی از استفاده ی این پیش پردازنده ها مورد نظر بوده که با توضیحاتی که عرض کردم الان باید برای شما قابل فهم باشه.
    البته این دستورات کاربرد ماکرویی هم دارن که فکر نکنم منظور شما اون باشه.
    Upload your files Here. Great Azeri Resumable File Host: http://endir.az/index.php?lang=5

    دیدگاه


      #3
      پاسخ : define# یعنی چی؟

      دوستمون پاسخ کاملی دادند و در یک کلام این دستورات برای کامپایلر مفاهیم خاصی رو میده و اون رو در ترجمه برنامه به زبان ماشین کمک میکنه!

      امیدوارم کمکی کرده باشم

      دیدگاه

      لطفا صبر کنید...
      X