define - cpp-02-11
define - cpp-02-11
توضیحات :
🔹 1. پاکسازی کد و ورود به مبحث جدید
در ادامهی جلسه قبل، چون برای π یک const تعریف کردیم، دیگر اجازهی مقداردهی دوباره نداریم. بنابراین کدهای اضافی و coutهای زائد را حذف میکنیم تا به مبحث جدید برسیم: پیشپردازندهها (Preprocessor) و دستور #define.
🔹 2. Preprocessor چیست؟
هر دستوری که با # شروع میشود (مثل #include یا #define)
قبل از کامپایل شدن اجرا و پردازش میشود.
یعنی:
قبل از اینکه خطهای اصلی کد وارد مرحلهی کامپایل شوند، پیشپردازنده کار خودش را انجام میدهد.
بعداً با مفاهیم پیچیدهتر مثل macro هم آشنا میشویم، اما فعلاً همین تعریف کافی است.
🔹 3. #define چیست و چگونه کار میکند؟
این دستور تایپ ندارد و فقط یک جایگزینی سادهی متنی انجام میدهد:
کامپایلر هر جا PI را ببیند، PI را حذف میکند و 3.14 را جای آن میگذارد.
هیچ بررسی دیگری هم انجام نمیدهد.
✔ مثال:
در مرحلهی پیشپردازش تبدیل میشود به:
همین. نه کمتر، نه بیشتر.
🔸 نکته مهم: استاندارد نامگذاری
ثابتها و defineها را معمولاً با حروف بزرگ تعریف میکنند:
PI – MAX_SIZE – WIDTH – HEIGHT
این یک قانون اجباری نیست، اما استاندارد رایج برنامهنویسی است.
🔹 4. تفاوت #define با const
✔ const
-
تایپ دارد (int, float, double, char, …)
-
فقط یک بار مقداردهی میشود
-
توسط کامپایلر چک میشود
-
خطاهای نوع داده بهخوبی مدیریت میشوند
-
خوانایی بهتر، مدیریت آسانتر
❌ define
-
تایپلس (بدون نوع)
-
فقط یک جایگزینی متنی است
-
هیچ خطای نوع داده را تشخیص نمیدهد
-
قابل دیباگ کردن نیست
-
میتواند باعث خطاهای عجیب و خطرناک شود
به همین دلیل در C++ مدرن تقریباً جای define در تعریف ثابتها خالی شده و از const و constexpr استفاده میشود.
🔹 5. چرا define خطرناک است؟ (مثال واقعی و خندهدار)
فرض کن این تعریف شوخیطور را بنویسی:
حالا اگر در برنامه بنویسی:
پیشپردازنده این را تبدیل میکند به:
نتیجه:
یک حلقهی بینهایت که ۵۰ سال هم سیستم روشن باشد، خروجی را مدام چاپ میکند.
چون define به هیچ عنوان تفاوت بین کلمات کلیدی، نوع داده یا ساختار زبان را نمیفهمد—فقط «جایگزینی متن» انجام میدهد.
🔹 6. جمعبندی نهایی
✔ const
-
ایمن
-
تایپدار
-
قابل بررسی
-
مناسب تعریف مقدارهای ثابت
-
استاندارد C++ مدرن
❌ #define
-
تایپلس
-
فقط جایگزینی متنی
-
خطر خطاهای عجیب
-
کماستفاده در C++ مدرن
برای تعریف ثابتها همیشه از
constیاconstexprاستفاده کنید، نه#define.
لطفا برای گذاشتن نظرات خود وارد شوید