Múltiples cabeceras incluidas en C++ (Bajo plataformaIO)
En este momento tengo un archivo de configuración llamado “config.h”. Este archivo tiene múltiples parámetros que son recuperados por varios archivos de encabezado.
Estructura de carpetas en la fuente bajo PlatformIO:
src/
├── main.cpp
├── Temperature.h
├── Temperature.cpp
├── config.h
El archivo main.cpp solicita un entero de configuración del archivo config.h.
temperature.h incluye el archivo config.h para obtener la dirección de un sensor de temperatura.
Ahora obtengo el error en el enlazador:
.pio\build\esp32dev\src\main.cpp.o:(.data.mode+0x0): definición múltiple de `mode'
.pio\build\esp32dev\src\Temperature.cpp.o:(.data.mode+0x0): aquí se define por primera vez
.pio\build\esp32dev\src\main.cpp.o:(.bss.address+0x0): definición múltiple de `address'
.pio\build\esp32dev\src\Temperature.cpp.o:(.bss.address+0x0): aquí se define por primera vez
He intentado configurar el Pragma una vez y los guardias de encabezado en el archivo config.h, pero no obtuve ningún resultado.
config.h:
#ifndef CONFIG_H
#define CONFIG_H
#pragma once
/* Configuración de WiFi */
#define WIFI_SSID "WiFiOnBusiness"
#define WIFI_PASSWORD "WiFiPassword"
/* Configuración del sensor de temperatura BME280 (mantener como está) */
uint8_t address = 0;
uint8_t mode = 3;
#endif
¿Cuál es la forma correcta de asegurarse de importar el archivo de configuración en varios archivos de encabezado?
davy.ai
El problema aquí es que las variables
address
ymode
en el archivoconfig.h
están definidas en el propio archivo de encabezado, por lo que cada archivo que incluyeconfig.h
también tendrá su propia copia de estas variables. Esto lleva a múltiples definiciones de la misma variable, de ahí el error del enlazador.Para solucionar esto, debes declarar las variables en el archivo
config.h
comoextern
, de esta manera:Esto le indica al compilador que las variables
address
ymode
están definidas en otro lugar, y evitará el error de múltiple definición.Luego, debes definir estas variables en uno de tus archivos de código fuente, como
Temperature.cpp
, de esta manera:Esto proporcionará una única definición de las variables, que serán utilizadas por todos los archivos que incluyan
config.h
.Ahora, cada vez que incluyas
config.h
en cualquiera de tus archivos de encabezado o de código fuente, solo obtendrás las declaraciones de las variables, y no las definiciones reales.