Jak definiować stałe? Const czy #define?

Płytka Arduino jest wyposażona w bardzo małą ilość pamięci Ram. Arduino Uno posiada 2048 B pamięci RAM dostępnej dla przechowywania zmiennych.
Więc jeżeli chcemy stosować stałe tak aby użyć jak najmniej (a najlepiej wcale) pamięci ram to lepiej użyć const czy #define?

Czym jest #define?

#define jest bardzo często błędnie rozumiane ponieważ ludzie myślą, że jest to stała jednak tak na prawdę jest to instrukcja preprocesora.

Działa to w ten sposób że Przez define definiujemy sobie pewną „stałą” którą kompilator zamieni na wartość którą podaliśmy
więc jeżeli piszemy taki kod

To kompilator zamieni go na coś takiego

Co to jest const?

Słowo kluczowe „const” informuje kompilator że zmienna (lub jej wskaźnik) nie mogą być modyfikowane. Jednak const nadal jest zmienną. W zależności od tego jak kompilator ją „odczyta” może ona używać lub nie pamięć RAM. Jednak kompilator avr-gcc jest na tyle „inteligentny” aby wiedzieć, że zmienna z modyfikatorem const nie może być aktywną zmienną dlatego nie pozostawia jej w pamięci RAM.

Więc ten kod nie będzie używał pamięć ram dla const.

WIELKA BITWA

Do porównania użytej pamieci ram użyjemy narzędzia avr-size dostępnego w kompilatorze avr-gcc

#define

Const


Zdziwiony
?

Obojętnie czy korzystasz z #define czy const ilość pamieci Ram jest taka sama.

W takim razie rodzi się pytanie kiedy uzywać define a kiedy const?
Teoretycznie oba można używać w tych samych miejscach jednak używanie #define może okazać się złą praktyką ponieważ podczas użycia nie jest sprawdzana poprawność kodu.
Czyli  jeżeli na przykład napiszemy tak kod. To w każdym miejscu będziemy mieli błąd w programie. Przy dużej ilości #define dość ciężko będzie dojść do ładu w kodzie.


Wniosek

Kompilator avr-gcc  jest na tyle „inteligentny” aby nie zapisywać const do pamieci ram a przy użyciu #define możemy natknąć się na „nieprzyjemności”. Więc lepiej będzie używać const.