PDA

View Full Version : دستور ifndef



C3phalex1n_0x
پنج شنبه 03 بهمن 1392, 17:38 عصر
سلام، دوستان کار کرد دستور ifndef در کد زیر چیه؟!
#ifndef PREPROC_H_
#define PREPROC_H_

#define ONE 1

#endif

Tiyana
پنج شنبه 03 بهمن 1392, 17:42 عصر
یه سری به اینجا بزن:

http://narming.persianblog.ir/post/17/
http://www.cprogramming.com/reference/preprocessor/ifndef.html

C3phalex1n_0x
پنج شنبه 03 بهمن 1392, 18:12 عصر
مرسی من قبلا این لینک ها رو دیده بودم.
اما مشکل من کمی در درک این فرمان #ifndef PREPROC_H_ هستش.
دقیقا نمی دونم چرا این دستور میآد همچین ثابتی رو مورد بررسی قرار می ده؟
در حالیکه اصلا من همچین ثابتی رو در برنامه خود ندارم.
اگر یکی بتونه یک مثال واضح تر بزنه ممنون می شم! چون خیلی در درک عملکرد این دو فرمان در فایل های .h مشکل دارم.
مرسی.

mostafi1391
پنج شنبه 03 بهمن 1392, 18:48 عصر
قرارا نیست define# هر جا ثابت باشه ثابت ها را بیشتر با const در نظر یگیر این دستور میاد بررسی میکنه اگه قبلا فایل PREPROC_H_ اینکلود نشده باشه ( استفاده نشده باشه ) اونو تو خط بعدی مورد استفاده قرار میده بهش میگن header guard


http://www.learncpp.com/cpp-tutorial/110-a-first-look-at-the-preprocessor/

Vitallity
پنج شنبه 03 بهمن 1392, 23:15 عصر
سلام، دوستان کار کرد دستور ifndef در کد زیر چیه؟!
#ifndef PREPROC_H_
#define PREPROC_H_

#define ONE 1

#endif
اسم این کار Include guard هست. شما حالت رو در نظر بگیر که سه کلاس در سه فایل مجزا داری... در فایل grandfather.h:

struct foo { int member; };

در فایل father.h: هدر grandfather.h رو include می‌کنی و در فایل آخر که child.cpp هست هم grandfather.h و هم father.h رو include می‌کنی... در این حالت grandfather.h در فایل child دو بار include شده (و زمان کامپایل با خطا مواجه می‌شی)... برای جلوگیری از این دو یا چندین مرتبه از فراخوانی می‌گیم ifndef که کوتاه شده if not defined (اگر x تعریف نشده باشد)، define x (x را تعریف کن) و در آخر قسمتی هم که کلاس یا هر چیز دیگه‌ای رو تعریف کردیم endif رو به کار می‌بریم که محدوده تعریف پایان بپذیره.
پس برای این که کلاس / فایل grandfather.h فقط یک بار در کل فراخوانی بشه اون رو به این صورت تغییر می‌دیم:

#ifndef GRANDFATHER_H
#define GRANDFATHER_H
struct foo
{
int member;
};
#endif


البته یه ماکرو غیر استاندارد دیگه‌ای هم هست (البته الآن تمام کامپایلرهای جدید اون رو پشتیبانی می‌کنن) که اون هم همین کار رو انجام می‌ده: #pragma once که فقط کافیه اول فایلت همین رو بنویسی (میتونی از جفت اینا هم با هم استفاده کنی که هم کامپایلرهای حدید و هم قدیمی اون رو پشتیبانی کنند.)