دستور define در برنامه نویسی آردوینو

به نظرم
همیشه که نه، اما تا جایی که میشه از حافظه کلا استفاده نکنیم بهتره.
اما یه موقع مثل جاهایی که مثلا حالت یه LED رو ذخیره میکردیم یا محاسباتی انجام میدادیم که بعدا از نتیجه اش استفاده کنیم، باید از یه ظرفی استفاده کنیم که اون نتیجه رو داخلش ذخیره کنیم و اگه از define استفاده کنیم یه عبارت بی معنایی میشه مثلا اینجا:
#define a 1
int b = 2;
a = a + b;

خط آخر رو وقتی از نگاه کامپیوتر میخونیم اینو میبینه که عجیبه
1 = 1 + 2;
یعنی 3 رو بریز توی یک که بی معنی هستش

این دستور میگه یک تابع به اسم MAX رو دیفاین کن که دو تا ورودی a و b میگیره و این دو تا رو مقایسه کن و هرکدوم بزرگتر بود، اون رو به عنوان خروجی بده. درواقع عمل ماکزیمم گیری رو انجام میده.

حالا فرق این روش تعریف تابع با حالت عادیش چیه؟ فرقش اینه که از این به بعد هرجای کد که تابع MAX رو صدا بزنید، واقعا کد نمیره یک جای دیگه و اون رو اجرا کنه، بلکه کامپایلر میاد اون خط کد ((a)>(b)? (a) : (b)) رو برمیداره و میذاره اونجا و این باعث میشه کد سریعتر اجرا بشه. هرچیزی ارزش این که یک تابع جدا باشه رو نداره. بعضی کارهای پیش پا افتاده مثل MAX رو میشه اینطوری تعریف کرد که سرعت بره بالا.

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

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

سلام استاد میشه توی برنامه نویسی آردوینو به جای بکار بردن int و char و … برای تعریف متغییر ها همیشه از define # استفاده کرد؟

#define MAX(a, b) ((a)>(b)? (a) : (b))

پس برای متغییر هایی که صرفا برای یک عدد فقط تعریف میشن و تو معادلات کابردی ندارن از define استفاده میکنیم. درسته؟

توی کد ها جاهایی از define استفاده میشه که بخواید یک چیز ثابت رو به یک اسم دیگه صدا بزنید. حتی می تونید اسم توابع رو عوض کنید. یک اسم رو دیفاین کنید به اسم یک تابع دیگه و از این به بعد اون تابع رو به اسم جدید صدا بزنید. معمولا define ها برای تنظیمات استفاده میشن و باعث میشن شما به راحتی و خوانایی بتونید کد رو تغییر بدید.
برای مثال:
فرض کنید که شما یک میکرو کنترلر دارید که ۳ تا خروجی usart داره و شما قراره که از usart 2 استفاده کنید برای خواندن مقدار دما. حالا فرض کنید که توابعی داریم به اسم readUSART1 و readUSART2 و readUSART3 . حالا اگه شما شروع کنید توی کد و از readUSART2 استفاده کنید، اگه به هر دلیلی مجبور بشید که به جای ۲ از ۳ استفاده کنید باید کل کد رو بخونید و بگردید همه رو عوض کنید. ولی یک کار بهتر و خوانا تر این هست که یک اسم جدید مثلا readTemperatureFromUsart رو دیفاین کنید به readUSART2. حالا از این به بعد هرجا بنویسید readTemperatureFromUsart خودش اون readUSART2 رو صدا میزنه و اگه هم قرار شد عوضش کنید، فقط کافیه اون خط دیفاین رو تغییر بدید.
البته define کاربردهای پیشرفته تری هم داره. مثلا شما می تونید یک تابع رو به طور کامل توی define تعریف کنید. این مثلا رو ببینید:

What is the use of #define in C?
In the C Programming Language, the #define directive allows the definition of macros within your source code. … Macro definitions are not variables and cannot be changed by your program code like variables. You generally use this syntax when creating constants that represent numbers, strings or expressions.

What does #define mean in C++?
#define is a useful C++ component that allows the programmer to give a name to a constant value before the program is compiled. Defined constants in arduino don’t take up any program memory space on the chip. The compiler will replace references to these constants with the defined value at compile time.

مثلا ممکنه عدد نباشه
یه حروف طولانی باشه
مثلا
#define AbbasPass “ABC123456”
اما همچنان ثابت