Operácie

AVR - Definície konštánt: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Vytvorená stránka „Spracované podľa Stackoverflow<ref group="REF">Jonathan Leffler: “static const” vs “#define” vs “enum” Available online:https://stackoverflow.com/questions…“
 
Balogh (diskusia | príspevky)
Bez shrnutí editace
 
(3 medziľahlé úpravy od rovnakého používateľa nie sú zobrazené.)
Riadok 1: Riadok 1:
Spracované podľa Stackoverflow<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>  
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

  1. Jonathan Leffler: “static const” vs “#define” vs “enum” Available online: https://stackoverflow.com/questions/1674032/static-const-vs-define-vs-enum
  2. 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?