PDA

View Full Version : مشکل با دستورات پیش پردازنده



Arashdn
جمعه 22 دی 1391, 11:18 صبح
سلام دوستان
یه دستور پیش پردازنده بصورت زیر داریم
#ifndef TIME_H
#define TIME_H

the entire file//

#endif

که متاسفانه هر چی گشتم نتونستم مفهوم و کاربردشونو متوجه بشم
ممنون میشم اگه یه نفر معنای این کد ها رو به زبان ساده توضیح بده ...

the king
جمعه 22 دی 1391, 12:41 عصر
سلام دوستان
یه دستور پیش پردازنده بصورت زیر داریم
#ifndef TIME_H
#define TIME_H

the entire file//

#endif

که متاسفانه هر چی گشتم نتونستم مفهوم و کاربردشونو متوجه بشم
ممنون میشم اگه یه نفر معنای این کد ها رو به زبان ساده توضیح بده ...

وقتی یک فایل header ای در چند فایل متفاوت include میشه، کامپایلر موقع include کردن مجددا خطا می گیره که چرا یک مورد
چند جا تعریف شده. برای رفع این مشکل یک عبارتی (یک اسمی) رو به نشانه این مساله در نظر می گیرند که فلان مورد تعریف شد.
اگر اون عبارت قبلا define شده بود، شرط ifdef برقراره و اگر define نشده بود، شرط ifndef برقراره.
از این ویژگی استفاده می کنند، یعنی شرط می کنند که اگر تعریف نشده بود، اول تعریف اش کنیم و بعد مورد مربوطه رو داخل بلاک ifndef و endif می نویسند.
ابنطوری همچین موردی حتی اگر چند جا include باشه، فقط دفعه اول که هنوز define نشده در نظر گرفته میشه و دفعات بعدی از وجودش صرف نظر میشه.

lexical_error
جمعه 22 دی 1391, 12:43 عصر
سلام
دستورات پیش پردازنده قبل از اینکه کامپایلر اجرا بشه اجرا میشن و سپس کدی که ایجاد شده توسط کامپایلر کامپایل میشه و فایل obj ایجاد میشه
دستور
#define
این دستور برای ایجاد ثابت به کار میره در واقع کاری که انجام میده جایگذاری یه رشته به جای عبارت مشخص شده هست.


#define size 100

این دستور باعث میشه تا هرجا که داخل کد برنامه عبارت size وجود داشت با مقدار 100 جایگزین بشه

دو دستور

#if define == (#ifdef)

#if !defined == (#ifndef)

که عبارات داخل پرانتز نوع کوتاه شده عبارات هست (هر دو یکی هستند)

دستور اول شرطی را ایجاد میکند که بررسی میکند آیا عبارت مشخص شده قبلا تعریف شده یا خیر و درصورت درست بودن دستورات اجرا میشوند
مثلا

#ifdef _TIME.H_
cout<<"defined";
#endif
در اینجا اگر عبارت _TIME.H_ از قبل تعریف شده باشد دستور cout اجرا میشود

دستور دوم دقیقا برعکس اولی کار میکنه و بررسی میکند که اگر عبارت تعریف نشده بود شرط را اجرا میکند
این دو دستور باید به دستور #endif ختم شوند

کاربردی هم که دارند معمولا اول فایلهای هدر نوشته میشوند تا اگر این فایل 2 بار include شده بود در برنامه فقط بار اول این عمل اتفاق بیفته

مثلا شما فکر کنید که 3 تا فایل مربوط به 3 کلاس مختلف دارید،که یکی از آنها کلاس پایه دو کلاس دیگر هست،حالا اگر هر دو کلاس مشتق شده بخوان که کلاس پایه رو به برنامه include کنن با یک خطای زمان کامپایل مواجه میشین، با استفاده از دستورات پیش پردازنده میتونید از این گونه مشکلات جلوگیری کنید...

Arashdn
جمعه 22 دی 1391, 13:08 عصر
ممنون از راهنمایی ها
فقط یه مسئله ای ، منظور از دو بار include شدن رو نفهمیدم
فرض کنیم من یه هدر دارم به نام arash.h
برنامه هم دو تا فایل داره به اسم های main.cpp و file.cpp
اگه دستور
#include "arash.h"
رو در هر دو فایل بزنم ارور میده ؟؟!!!!

the king
شنبه 23 دی 1391, 07:28 صبح
ممنون از راهنمایی ها
فقط یه مسئله ای ، منظور از دو بار include شدن رو نفهمیدم
فرض کنیم من یه هدر دارم به نام arash.h
برنامه هم دو تا فایل داره به اسم های main.cpp و file.cpp
اگه دستور
#include "arash.h"
رو در هر دو فایل بزنم ارور میده ؟؟!!!!

منظورم رو درست متوجه نشدید، به Include شدن که ایراد نمی گیره، به تعریف مجدد موارد ایراد می گیره.
فرضا شما در main.cpp دارید :


#include <stdio.h>
#include "file.h"
#include "arash.h"

int main()
{
int max = Maximum;
return 0;
}


و در file.h دارید :


const int Maximum = 100;


و در arash.h دارید :


#include "file.h"
const int MaxCount = Maximum;


و خطا میگیره که چرا Maximum مجددا تعریف شده.

و شما با define# مشکل رو در file.h رفع می کنید :


#ifndef MaxCount_H
#define MaxCount_H
const int Maximum = 100;
#endif