c++ - soldados - nunca molestes a un guardia real
C++ incluye guardias que no parecen estar funcionando (2)
Debe marcar las declaraciones como " extern " de esta manera:
extern DigitalOut led1;
Luego defínalas (es decir, asigna almacenamiento para ellas) en sample.cpp usando la expresión que solías tener en el encabezado.
Recibo mensajes de error del compilador mbed C ++ que parecen ser indicativos de un mal funcionamiento incluyen guardias.
En main.cpp, incluyo mi archivo de encabezado de la siguiente manera:
#include "mbed.h"
#include "sample.h"
Esta es mi muestra.h:
#include "mbed.h"
#ifndef STUFF_H
#define STUFF_H
/* LEDs */
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);
/* Subroutines */
void sweepLEDs();
void pulseLEDs(int numPulses);
void clearLEDs();
#endif
En sample.cpp, incluyo sample.h de la siguiente manera:
#include "sample.h"
Tanto en main.cpp como en sample.cpp, me refiero a las variables led1, led2, led3, led4
sin declararlas. Sin embargo, el compilador está generando estas quejas:
"Symbol led1 multiply defined (por sample.cpp.cpp.LPC1768.o y main.cpp.cpp.LPC1768.o)". ... "Symbol led4 multiply defined (por sample.cpp.cpp.LPC1768.o y main.cpp.cpp.LPC1768.o)".
¿Mis protectores de inclusión están escritos incorrectamente? ¿O hay algún otro problema?
(Como referencia, aquí está el enlace a la fuente mbed.h )
El problema es un malentendido de lo que incluyen los guardias. Incluya guardias para evitar que el compilador vuelva a ver el mismo contenido en la misma unidad de traducción (para el mismo archivo .cpp). No impiden que las unidades de traducción separadas vean el mismo código.
En su archivo de encabezado, usted define (no solo declara) las variables. Por lo tanto, cada unidad de traducción que incluye el encabezado crea su propia copia de esas variables.
La forma correcta de hacerlo es definir las variables en un archivo .cpp y solo declararlas en el encabezado (las guardias de inclusión deben estar allí de todos modos, para evitar la inclusión múltiple en la misma unidad de traducción).
Es decir, en su archivo sample.h, prefija sus variables con extern
y elimine el inicializador (para que solo estén declaradas, no definidas), y defínelas en el archivo .cpp correspondiente (aquel donde también se definen las funciones), poniendo allí las definiciones exactas de su encabezado.
En una nota no relacionada, debe poner #include "mbed.h"
en sample.h dentro de las guardias de inclusión, porque algunos compiladores optimizan la velocidad de compilación para tales protecciones, y esa optimización no funciona si hay material fuera de las protecciones de inclusión. Tenga en cuenta que esto no es realmente un problema de corrección (suponiendo que mbed.h está protegido adecuadamente por incluir guardias también), sino un problema de compilación del rendimiento.