سلام!
به چنین دستوراتی پیش پردازنده می گن که قبل از کامپایل کد اصلی اجرا میشن تا تغییراتی رو روی کد اصلی پیش از کامپایل اعمال کنن.
با توجه به کدی که قرار دادید یه identifier به نام HEADERFILE_H وجود داره. با اجرای خط اول کد شما توسط کامپایلر، دستور #ifndef بررسی می کنه آیا HEADERFILE_H قبلا" تعریف شده یا خیر. اگر تعریف نشده باشه، کامپایلر میره سراغ خط بعد و با دستور #define این identifier رو تعریف می کنه و در نهایت کد ها تا قبل از رسیدن به عبارت #endif کامپایل میشن. ولی اگر HEADERFILE_H قبلا" با دستور #define تعریف شده باشه، کامپایلر کد های بعد از عبارت #endif رو کامپایل می کنه.
حالا دلیل استفاده از این دستورات چیه؟
فرض کنیم کد شما دقیقا" به این شکله و در هدرفایلی به نام parents.h نوشته شده:
همچنین فرض کنیم هدرفایلی دیگه ای به نام child.h هم وجود داره که توش هدرفایل parents.h وارد شده؛ به شکل زیر:کد:#ifndef HEADERFILE_H #define HEADERFILE_H struct foo { int member; }; #endif
حالا ما در کد اصلی فرضا" به دلایلی نیاز داریم هر دو هدرفایل رو وارد کنیم"کد:#include "parents.h"
در parents.h یک بار متغیر member تعریف میشه و در child.h هم چون هدر parents رو include کردیم، قاعدتا" یه بار دیگه باید متغیر member تعریف بشه و از طرفی تعریف بیش از یک بار یه متغیر سبب بروز خطا میشه. ولی حالا بیاییم بررسی کنیم که چطوری پیش پردازنده های استفاده شده، مانع از بروز چنین خطایی میشن:کد:#include "parents.h" #include "child.h"
در خط اول کد اصلی، اول هدر parents وارد میشه.
در خط اول هدر parents تعریف HEADERFILE_H بررسی میشه. چون HEADERFILE_H قبلا" تعریف نشده، در خط دوم همین هدر تعریف میشه و کد های هدر تا عبارت #endif کامپایل میشن.
در خط دوم کد اصلی، هدر child وارد میشه.
در خط اول هدر child هدر parents مجددا" وارد میشه.
در خط اول هدر parents تعریف HEADERFILE_H بررسی میشه. چون این بار HEADERFILE_H تعریف شده، کد ها تا عبارت #endif کامپایل نمیشن و در نتیجه متغیر member مجددا" تعریف نمیشه. بدین وسیله توسط پیش پردازنده ها از بروز خطا جلوگیری کردیم.
برای اطلاعات بیش تر:
http://www.cplusplus.com/doc/tutorial/preprocessor/
Bookmarks