const در برابر #define - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

const در برابر #define

+3 امتیاز
سلام تعریف کردن مقادیر ثابت بصورت const بهتره یا define ؟ چرا ؟
سوال شده آذر 6, 1392  بوسیله ی afshin70 (امتیاز 44)   4 7 12

5 پاسخ

+5 امتیاز

فرق اين دو اينه كه define# يك دستور پيش پردازنده ( PreProcessor) هست كه پيش از زمان ترجمه ي متن همه ي جاهايي كه شما از اون بكاربرديد رو با مقدار داده شده جابجا ميكنه .

براي مثال

#define SS 1

int main ()
{
   int o = SS;
   float t = SS * 5;
}

دززمان ترجمه متن همه ي SS ها با مقدار 1 جابجا ميشن .

ولي const يك متغيير هست . كه هم داراي آدرس هست هم داراي همه ي وي‍ژگي هاي متغییر ها است تنها با اين فرق كه ايستا هم هست .

 

پاسخ داده شده آذر 6, 1392 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
+4 امتیاز

همون جور که Negative_Se7en گفتن define  صرفا یک پیش پردازندست  احتمالا حتی قبل از این که کامپایلر بتونه کدو ببینه عددو جایگزین symbol می کنه .

استفاده از const  بهتر از define ه چون خطایابی کد رو ساده تر می کنه مثلا فرض کن این کدو داری :

#include <iostream>
const double PI = 3.14;
int main()
{
    PI=12;
}

الان این ارور میده که

|error: assignment of read-only variable 'PI'|

ولی اگر بیای خط 2 رو بصورت define تعریفش کنی این جور اروری میده  که اصلا مشخص نیست مال چیه !

error: expected primary-expression before '=' token

دلیلشم اینه که PI رو به شکل یک عدد میبینه نه یک متغیر که حافظه داره ( به خاطر همون replace کزدن که گفتم )

این مشکل دیباگ کردن کدو هم سخت تر می کنه.

از نظر سرعت هم از اونجایی که کامپایلر های c++  کاملا بهینه هستن  هیچ فرقی بین این 2 تا وجود نداره .

 

پاسخ داده شده آذر 6, 1392 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
ویرایش شده بهمن 23, 1392 بوسیله ی BlueBlade
+4 امتیاز

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

class TMyClass
{
private:
    float X, Y, Z;
public:
    #define GetSet_LOCAL_MACRO(A)           \
    float Get##A##Value()                   \
    {                                       \
        return A;                           \
    };                                      \
    void Set##A##Value(const float _##A)    \
    {                                       \
        A = _##A;                           \
    };

    GetSet_LOCAL_MACRO(X)
    GetSet_LOCAL_MACRO(Y)
    GetSet_LOCAL_MACRO(Z)
};

این کار کد نویسی رو کوتاه میکنه و با یک تغییر میتونید تمام توابع رو تغییر بدید.

پاسخ داده شده آذر 6, 1392 بوسیله ی محمد قدیانی (امتیاز 317)   1 9
تریک جالبی بود.
+3 امتیاز

مزیت های const نسبت به #define

  • قواعد scoping در موردش صدق می کنه
  • آدرسشو میشه دید
  • میشه debugesh کرد
پاسخ داده شده آذر 6, 1392 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
+1 امتیاز

شما با define میتونی دستور رو هم نهان سازی کنی :

#define U unsigned
int main()
{
    U int a = 0; // ino mifahme chie.
    U long b = 123; // inam mifahme.
     
cout << a << b;
return 0;
     // no compilation error.
}

ولی ترجیحا از const استفاده کن برای جای گذاری عدد

با این حال یه جاهایی (بیشتر جنبه توضیحی) استفاده از #define بهتره.

در ضمن :

#define برای خیلی کارهای دیگه به کار میره. مثلا Header Gaurd ها که یه مثال سادس.

#ifndef HEADER_H
#define HEADER_H

#endif

 

پاسخ داده شده دی 21, 1393 بوسیله ی Arshia::Aghaei (امتیاز 108)   8 14 22
ویرایش شده شهریور 13, 1394 بوسیله ی Arshia::Aghaei
...