PDA

View Full Version : سوال: تفاوت قرار دادن و قرار ندادن ماکرو و راهنما در ابتدا و انتهای هدر فایل



motherboard
سه شنبه 14 مرداد 1393, 20:46 عصر
سلام.همگی حتما وقتی یک هدر فایل می سازید یک چنین خطوطی رو دیده اید:


#ifndef DDEED_H
#define DDEED_H

#endif


اما بدون قرار دادن این ماکرو و راهنما ها باز میشه برنامه رو کامپایل کرد.کسی اطلاعی داره حکمت وجود چنین خطوطی در ابتدا و انتهای یک هدر فایل به صورت پیش فرض در کیوت چیست؟

کامبیز اسدزاده
سه شنبه 14 مرداد 1393, 21:04 عصر
سلام.همگی حتما وقتی یک هدر فایل می سازید یک چنین خطوطی رو دیده اید:


#ifndef DDEED_H
#define DDEED_H

#endif


اما بدون قرار دادن این ماکرو و راهنما ها باز میشه برنامه رو کامپایل کرد.کسی اطلاعی داره حکمت وجود چنین خطوطی در ابتدا و انتهای یک هدر فایل به صورت پیش فرض در کیوت چیست؟

سلام

خب این بحث مربوط به ذات خود C++‎‎‎ هستش...
به طور کلی در برنامه نویسی C++‎‎‎ ما بحثی داریم به نام Macro Guard (ماکرو گارد) ساختار و روشی هستش که برای اجتناب و جلوگیری از مشکل الحاق مجدد فایل‌های هدر (.h) توسط include# مورد استفاده قرار میگیرد.

فرض کنید من 3 تا فایل هیدر دارم که در یکی از این ها کدی دارم به صورت زیر :

فایل : MyTest.h


struct foo {
int member;
};


حالا من میام در فایل دیگری به صورت زیر این رو فراخوانی میکنم مثلا فایلی با نام : H1.h


#include "MyTest.h"


خب در این صورت تا اینجا مشکلی ندارم...
میام یه فایل دیگه ای ایجاد میکنم با نام H2.h
و در اینجا مجددا این فایل اصلی رو اینکلود میکنم :


#include "MyTest.h"


تا قبل از این فایل من در حین کامپایل هیچ مشکلی نخواهم داشت ولی هنگامی که به این فایل میرسیم در حال کامپایل خطا خواهد داد که شما نمیتونید مجددا هیدری رو در فایل دیگه ای استفاده کنید برای رفع این مشکل من باید فایل اصلیم رو با استفاده از پیشپردازنده بهینه کنم پس کدم رو در فایل اصلی به صورت زیر تغییر میدم :


#ifndef MYTEST_H
#define MYTEST_H


struct foo {
int member;
};
#endif



حالا این فایل رو هرکجا اینکلود کنم هنگام کامپایل خطا نخواهد داد و برنامه به درستی کامپایل خواهد شد.
روشش هم به این صورت هستش وقتی در زمان کامپایل به فایل H1.h میرسیم هیچ مشکلی نداریم ولی وقتی به فایل دم یعنی H2.h میرسیم در همین جا توسط ماکرو گارد مقدار false به H2 ارسال میشه که نتیجه ifndeF#‎‎‎ خواهد بود که از فایل MyTest.h برگشت داده میشود بنا براین کامپایل کد بعد از #endif موجود در فایل MyTest.h ادامه پیدا میکنه و از روی کامپایل مربوط به تعریف تکراری رد میشه که این عمل باعث نادیده گرفتن حساسیت برای تعریف های چندگانه هیدر ها هستش که توسط ماکرو گارد مشکلش حل خواهد شد.

معمولا این روش برای رفع مشکلات خطا در زمان کامپایل مورد استفاده قرار میگیره.