AVR - Definície konštánt: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
Riadok 16: | Riadok 16: | ||
* Ak chceme použiť konštantu do príkazu switch, nedá sa použiť (1) | * Ak chceme použiť konštantu do príkazu switch, nedá sa použiť (1) | ||
* Ak chceme inicializovať statickú premennú, nemôžeme použiť (1) | * Ak chceme inicializovať statickú premennú, nemôžeme použiť (1) | ||
== Prečo použiť #define == | |||
Treba si uvedomiť, že #define nie je príkaz, ale tzv. makro. To znamená, že ešte pred samotným prekladom programu tzv. preprocesor nahradí všetky výskyty textu v kóde. | |||
Napríklad | |||
#define ledPin 13 | |||
sa nahradia všetky výskyty textu ledPin číslom 13. Výhodou je, že premenná ledPin neobsadí žiadne miesto v cennej RAM pamäti. Dokonca vlastne žiadna premenná ledPin ani nevznikne. | |||
== Kedy použiť const == | |||
Ak použijeme modifikátor const, hovoríme kompilátoru, že daná premenná sa nebude (a ani nesmie) meniť. Obvykle sa vytvorí premenná v pamäti RAM a to aj s príslušným pointrom na túto premennú. Avšak prekladač avr-gcc väčšinou pochopí, že takýto kúsok kódu má preložiť tak, aby neobsadil žiadnu pamäť RAM. | |||
Napríklad | |||
const int ledPin=13; | |||
neobsadí v pamäti tiež žiadne miesto. | |||
Ak si to chcete overiť a vyskúšať, dá sa to z príkazového riadku | |||
avr-size -C sketch_nov11a.cpp.elf | |||
Verzia z 21:40, 22. január 2021
Spracované z niekoľkých zdrojov[REF 1][REF 2] na internete.
Niekde sa na definície konštánt (napr. pripojenie periférí ku konkrétnym pinom používa
static const int led = 13; (1)
alebo
#define led 13 (2)
alebo niekde aj
enum { led = 13 }; (3)
Odpoveď je rôzna v závislosti od toho, či používame jazyk C++ alebo C. Pre C++ platí prvá možnosť, vždy použiť const. V jazyku C odpoveď záleží od použitia:
- Ak potrebujeme aj pointer, tak musíme použiť (1),
- pretože pre (2) pointer nevznikne.
- Možnosti (1) a (3) vytvoria aj symbol pre debugger, možnosť (2) nie.
- Ak potrebujeme určiť rozmer poľa alebo reťazca, nedá sa použiť (1).
- Ak chceme použiť konštantu do príkazu switch, nedá sa použiť (1)
- Ak chceme inicializovať statickú premennú, nemôžeme použiť (1)
Prečo použiť #define
Treba si uvedomiť, že #define nie je príkaz, ale tzv. makro. To znamená, že ešte pred samotným prekladom programu tzv. preprocesor nahradí všetky výskyty textu v kóde. Napríklad
#define ledPin 13
sa nahradia všetky výskyty textu ledPin číslom 13. Výhodou je, že premenná ledPin neobsadí žiadne miesto v cennej RAM pamäti. Dokonca vlastne žiadna premenná ledPin ani nevznikne.
Kedy použiť const
Ak použijeme modifikátor const, hovoríme kompilátoru, že daná premenná sa nebude (a ani nesmie) meniť. Obvykle sa vytvorí premenná v pamäti RAM a to aj s príslušným pointrom na túto premennú. Avšak prekladač avr-gcc väčšinou pochopí, že takýto kúsok kódu má preložiť tak, aby neobsadil žiadnu pamäť RAM. Napríklad
const int ledPin=13;
neobsadí v pamäti tiež žiadne miesto.
Ak si to chcete overiť a vyskúšať, dá sa to z príkazového riadku
avr-size -C sketch_nov11a.cpp.elf
References
- ↑ Jonathan Leffler: “static const” vs “#define” vs “enum” Available online: https://stackoverflow.com/questions/1674032/static-const-vs-define-vs-enum
- ↑ James Lewis: Const vs #define – When do you use them and why? Available online: https://www.baldengineer.com/const-vs-define-when-do-you-them-and-why.html?