mozno blba poznamka, ale ak tie premenne nie su sucastou rozhrania toho modulu, tak ich daj _len_ do *.c suboru z pamatovou triedou static. Rovnako aj funkcie, ktore su interne pre ten modul.
Bezny program v C vyzera asi takto (trochy vyumelkovany, ale nie az tak moc):
header (switch_led.h):
#ifndef LED_H
#define LED_H
/* pin na ktorom je pripojena LED-ka, toto by mal uzivatel nastavit a menit len ked je LED-ka vypnuta */
extern int the_led_pin;
/* ak je aktualne LED-ka zapnuta, tak ju vypne a naopak */
void switch_led();
/* vrati ci je LED-ka zapnuta */
int is_led_on();
#endif
implementacia (switch_led.c):
#include "switch_led.h"
int the_led_pin = 0;
static char is_on = 0; /* dame char, pac setrime pamat, zjavne len globalnu a na stacku moc nie */
static void digital_write(int pin, int value) { /* ...poslat na pin hodnotu 0 alebo 1... */ }
void switch_led() { is_on = !is_on; digital_write(the_led_pin, (int)is_on); }
int is_led_on() { return (int)is_on; }
main (main.c)
#include "switch_led.h"
void main() {
the_led_pin = 5;
while(1) {
/*...nieco */
switch_led();
/*..blabla */
switch_led();
/* este nieco */
}
}
poznamky:
- extern je pouzite spravne, a skvele ze je v *.h subore, videl som kopec kodu, kde deklaraciu chlapci pastovali do kazeho *.c suboru! :-)
- main.h som este v zivote nevidel fungovat to bude ale main vacsinou pouziva veci z ostatnych modulov
- keby mi zacalo dochadzat miesto na MCU, tak by som funkciu is_led_on nahradil globalnou premennou ale potom riskujem ze mi tam blby pouzivatel mojho modulu nieco zapise a cele sa rozsype...
- ako uz bolo spominane c++ ma identicku reziu a velkost vysledneho kodu ako c. Navyse ma inline funkcie (!!). Samozrejme opatrne z virtual, template, dynamic_cast, typeid, throw a podobnymi featurami (na MCU polovica aj tak nebude)