Problemi con definizioni multiple

Buona sera,
so che in Arduino IDE la gestione delle compilation unit è particolarmente complessa.
Sto dividendo il programma in vari file per mantenere il codice ordinato e sto notando che le direttive al precompilatore #ifndef vengono praticamente ignorate tant'è che se includo header1.h file nel suo rispettivo header1.cpp ed in main.h tutte le variabili globali definite nel header1.h vanno in redefinition nonostante header1.h inizi con:

#ifndef __HEADER1_H__
#define __HEADER1_H__

//Dichiarazioni

#endif

(ho provato pure con #pragma once ma non cambia il comportamento)
è un problema noto? Si può risolvere?

Alan

non è un problema dell'IDE o del compilatore...

il problema è l'uso di .h per definire le variabili. dovresti solo dichiarare le variabili in .n (come extern) e definirle in .cpp.

module.h

#ifndef __HEADER1_H__
#define __HEADER1_H__

extern int xyz;
...
#endif

module.cpp

#include "module.h"
int xyz;
...

è necessario allocare la memoria una sola volta, quindi non può essere nel file .h

Intanto grazie per la risposta immediata!
Poi:

Quindi questo in generale?

Ora, facendo in università corsi di programmazione dicono che le variabili "NON DEVONO" essere globali (o comunque è fortemente sconsigliato), in Arduino di definire variabili globali è una pratica che si può mantenere oppure ci sono metodi più efficienti e/o corretti per definire lo scope alle variabili?

Alan

qualsiasi variabile al di fuori di una funzione è per natura globale, la sua durata è quella del programma.

d'altra parte, definisci quali variabili dovrebbero essere visibili all'esterno di un file .cpp dichiarando questa variabile come extern.

  • Se non lo dichiari nel file .h, sarà visibile solo in questo file .cpp
  • se lo dichiari extern nel file .h, sarà visibile a tutti i .cpp o .ino che importeranno il .h

è infatti buona norma ridurre il numero di variabili globali in generale e utilizzare le variabili locali quando possibile.

Ottimo grazie

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.