PDA

مشاهده نسخه کامل : ifndef و define



life24
03-06-13, 19:37
#ifndef HEADERFILE_H
#define HEADERFILE_H

and at the end of the file is







#endif


سلام
امکان داره توضیح بدید؟ دقیقا هیچی نفهیدم
مثالی چیزی

ravegoat
04-06-13, 08:49
سلام!

به چنین دستوراتی پیش پردازنده می گن که قبل از کامپایل کد اصلی اجرا میشن تا تغییراتی رو روی کد اصلی پیش از کامپایل اعمال کنن.

با توجه به کدی که قرار دادید یه identifier به نام HEADERFILE_H وجود داره. با اجرای خط اول کد شما توسط کامپایلر، دستور #ifndef بررسی می کنه آیا HEADERFILE_H قبلا" تعریف شده یا خیر. اگر تعریف نشده باشه، کامپایلر میره سراغ خط بعد و با دستور #define این identifier رو تعریف می کنه و در نهایت کد ها تا قبل از رسیدن به عبارت #endif کامپایل میشن. ولی اگر HEADERFILE_H قبلا" با دستور #define تعریف شده باشه، کامپایلر کد های بعد از عبارت #endif رو کامپایل می کنه.

حالا دلیل استفاده از این دستورات چیه؟
فرض کنیم کد شما دقیقا" به این شکله و در هدرفایلی به نام parents.h نوشته شده:


#ifndef HEADERFILE_H
#define HEADERFILE_H

struct foo {
int member;
};

#endif



همچنین فرض کنیم هدرفایلی دیگه ای به نام child.h هم وجود داره که توش هدرفایل parents.h وارد شده؛ به شکل زیر:


#include "parents.h"



حالا ما در کد اصلی فرضا" به دلایلی نیاز داریم هر دو هدرفایل رو وارد کنیم"




#include "parents.h"
#include "child.h"




در parents.h یک بار متغیر member تعریف میشه و در child.h هم چون هدر parents رو include کردیم، قاعدتا" یه بار دیگه باید متغیر member تعریف بشه و از طرفی تعریف بیش از یک بار یه متغیر سبب بروز خطا میشه. ولی حالا بیاییم بررسی کنیم که چطوری پیش پردازنده های استفاده شده، مانع از بروز چنین خطایی میشن:

در خط اول کد اصلی، اول هدر parents وارد میشه.
در خط اول هدر parents تعریف HEADERFILE_H بررسی میشه. چون HEADERFILE_H قبلا" تعریف نشده، در خط دوم همین هدر تعریف میشه و کد های هدر تا عبارت #endif کامپایل میشن.
در خط دوم کد اصلی، هدر child وارد میشه.
در خط اول هدر child هدر parents مجددا" وارد میشه.
در خط اول هدر parents تعریف HEADERFILE_H بررسی میشه. چون این بار HEADERFILE_H تعریف شده، کد ها تا عبارت #endif کامپایل نمیشن و در نتیجه متغیر member مجددا" تعریف نمیشه. بدین وسیله توسط پیش پردازنده ها از بروز خطا جلوگیری کردیم.

برای اطلاعات بیش تر:
Only the registered members can see the link