es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que las variables address y mode en el archivo config.h están definidas en el propio archivo de encabezado, por lo que cada archivo que incluye config.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 como extern, de esta manera:

    #ifndef CONFIG_H 
    #define CONFIG_H
    
    /* Configuración de WiFi */
    #define WIFI_SSID                       "WiFiOnBusiness"
    #define WIFI_PASSWORD                   "WiFiPassword"
    
    /* Configuración de Temperatura BME280 (Dejar como está) */
    extern uint8_t address;      
    extern uint8_t mode;             
    
    #endif
    

    Esto le indica al compilador que las variables address y mode 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:

    #include "config.h"
    
    /* Configuración de Temperatura BME280 (Dejar como está) */
    uint8_t address = 0;      
    uint8_t mode = 3;
    

    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.

Comments are closed.