AVR - Definície konštánt: Rozdiel medzi revíziami
Zo stránky SensorWiki
Vytvorená stránka „Spracované podľa Stackoverflow<ref group="REF">Jonathan Leffler: “static const” vs “#define” vs “enum” Available online:https://stackoverflow.com/questions…“ |
Bez shrnutí editace |
||
(3 medziľahlé úpravy od rovnakého používateľa nie sú zobrazené.) | |||
Riadok 1: | Riadok 1: | ||
Spracované | Spracované z niekoľkých zdrojov<ref group="REF">Jonathan Leffler: “static const” vs “#define” vs “enum” Available online: https://stackoverflow.com/questions/1674032/static-const-vs-define-vs-enum </ref><ref group="REF">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?</ref> na internete. | ||
Niekde sa na definície konštánt (napr. pripojenie periférí ku konkrétnym pinom používa | Niekde sa na definície konštánt (napr. pripojenie periférí ku konkrétnym pinom používa | ||
static const int led = 13; | static const int led = 13; (1) | ||
alebo | alebo | ||
#define led 13 | #define led 13 (2) | ||
alebo niekde aj | alebo niekde aj | ||
enum { led = 13 }; | 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. | 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. | ||
Riadok 18: | Riadok 17: | ||
* 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 | |||
alebo v konzole pri preklade v AVR studiu. | |||
Aktuálna revízia z 21:46, 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
alebo v konzole pri preklade v AVR studiu.
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?