Devo usare le variabili globali extern o le variabili globali statiche con le funzioni "get" e "set" in C [duplicate]

1

Sto lavorando su uno dei miei primi progetti in C (codice microcontrollore) che è suddiviso in più file C. Ho notato alcune incongruenze nella mia codifica in cui avevo dichiarato alcune variabili come variabili globali extern e le avrei semplicemente accedute direttamente (ISR e in altri luoghi), e altre hanno dichiarato variabili globali statiche e le avrebbero quindi accedute da file diversi usando le chiamate di funzione.

Qual è il modo migliore per farlo? Devo sempre mantenere l'ambito il più piccolo possibile anche se questo significa aggiungere funzioni extra solo per impostare o leggere i valori? O dovrei semplicemente renderli globali su tutti i file e solo accedervi direttamente.

    
posta w1res 26.03.2013 - 15:46
fonte

2 risposte

0

Direi che in questo caso specifico probabilmente otterresti lo stesso effetto dichiarando le variabili come extern . Sto basando questo sui seguenti presupposti:

  • Non hai alcuna logica nei tuoi getter / setter e non intendi aggiungerne.
  • Hai una dichiarazione di foo , e funzioni getFoo() e setFoo() . Se hai diverse variabili denominate foo , con diverse funzioni getter / setter, che chiaramente non puoi renderle extern (ma probabilmente dovresti rinominarle comunque).

Detto questo, il codice sarà più modulare (ma non meno accoppiato) se si adotta la pratica di definire static variabili all'interno dell'unità di compilazione e accedervi tramite getter / setter.

    
risposta data 26.03.2013 - 16:01
fonte
0

La cosa più importante è definire un'API e attenervisi. C offre diversi modi per nascondere l'implementazione che assomiglia a funzioni per i chiamanti, ed è preferibile l'accesso diretto perché ti dà più possibilità di modificare l'implementazione senza violare il codice esistente.

Ad esempio, puoi iniziare con le variabili e accedere mascherato come funzioni dal preprocessore:

/* bar.h - Extern-Based Version */
extern int bar_foo;
#define bar_foo_get()  (bar_foo)
#define bar_foo_set(x) bar_foo = (x)

In seguito, se hai bisogno delle funzioni bona fide con la logica al loro interno, l'interfaccia rimane la stessa:

/* bar.h - Function-Based Version. */
extern int  bar_foo_get();
extern void bar_foo_set(int x);

Hai anche la possibilità di scrivere le tue funzioni get e set come inline . Questo ti dà il meglio di entrambi i mondi riducendo il sovraccarico e fornendo un migliore controllo delle chiamate in fase di compilazione. Ci possono essere alcune implicazioni sulla portabilità che possono essere superate da sapendo cosa sono e codificando attentamente attorno a loro .

Il metodo che scegli dipende in realtà dal fatto che la tua applicazione possa tollerare l'overhead extra di una chiamata di funzione.

    
risposta data 26.03.2013 - 18:56
fonte

Leggi altre domande sui tag