Variables globales en un sketch dividido

Estoy trabajando en un sketch que he dividido en tres ficheros:

  • proyecto.ino
  • proyecto_auxiliar.cpp
  • proyecto.h

No tengo ningún problema para que el compilador reconozca los #includes, #defines y funciones de usuario que he definido en la cabecera proyecto.h

Sin embargo debo definir varias variables globales cuyo "scope" son los tres ficheros, pero no consigo que funcionen ni encuentro documentación de cómo definir las variables globales en sketch dividido.

Si defino las variables en el fichero proyecto.ino antes de la función loop(), el compilador me indica un error (activeBand es una de las variables).

'activeBand' was not declared in this scope'

Si defino las variables en la cabecera proyecto.h el compilador me da el siguiente error

'redefinition of 'bool activeRigStatus' // (activeRigStatus es otra variable)

Naturalmente las variables únicamente definidas en uno de los dos ficheros. Todo lo demás, como he comentado, no me da problemas

Intuyo que estoy cometiendo un error de principiante y recurro a este foro porque no he encontrado mucha información sobre la forma de trabajar con ficheros fraccionados.

No he considerado necesario publicar el código para plantear el problema.

Agradeceré cualquier tipo de ayuda.

Tienes que utilizar el modificador extern.

Por ejemplo una variable que se llama pepe la declaras en un fichero .cpp:

#include "fichero.h"

int pepe;

Luego creas el fichero de cabecera para ese fichero, el .h, y defines la variable con el modificador:

#ifndef _fichero_h_
#define _fichero_h_

extern int pepe;

#endif

Y cada vez que añades el .h con un include en cualquier parte del programa tendrás la variable accesible, por ejemplo en un .ino:

#include "fichero.h"


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
 Serial.print(global);
}

Con el ide de arduino si renombras proyecto_auxiliar.cpp como proyecto_auxiliar.ino no hace falta usar extern.

Pero esto es una facilidad que tiene el ide de arduino, junta todos los ficheros .ino en un fichero temporal y se compila. Así no da errores de 'was not declared in this scope'

Saludos

1 Like

Perfecto, he optado por la solución que propone victorham como más versátitil (me ha parecido) aunque la solución de harkonnen también es atractiva.

Funciona y quedo muy agradecido a ambos.