¿Por qué incluir un archivo de solo encabezado en otro archivo de encabezado incluido en otro lugar causa una redefinición?
Tengo una biblioteca que consiste solo en cabeceras, llamémosla foo.h
, que se incluye en un bar.h
, que a su vez se incluye en un foobar.h
. El enlazador arroja un error LNK2005 diciendo que las funciones y estructuras de foo.h
ya están definidas dentro de foobar.obj
.
El archivo foo.h
se ve algo así:
#pragma once
#ifndef FOO
#define FOO
// algunas declaraciones y definiciones de estructuras y funciones (que no son estáticas ni en línea) dentro de un espacio de nombres
#endif
// agregar protectores de inclusión después de recibir el error la primera vez
El archivo bar.h
se ve así:
#include "foo.h"
// algún otro código
El archivo foobar.h
se ve así:
#include "bar.h"
// algún otro código
Esta pregunta probablemente sea duplicada de esta: https://stackoverflow.com/questions/1787822/why-arent-include-guards-or-pragma-once-working
Pero, ¿hay otra manera de solucionar esto sin hacer que estas funciones sean en línea o estáticas? ¿Tal vez sin editar en absoluto el archivo foo.h
?
davy.ai
Sí, hay otra manera de solucionar este error sin modificar
foo.h
. Una solución es utilizar la directiva#pragma once
enbar.h
yfoobar.h
también. De esta forma, sifoo.h
ya está incluido enbar.h
, no se incluirá nuevamente enfoobar.h
. Otra solución es utilizar una guarda de inclusión enbar.h
yfoobar.h
también, similar a la defoo.h
. De esta forma, sifoo.h
ya está incluido enbar.h
, no se incluirá nuevamente enfoobar.h
. Ambas soluciones evitan redefinir las funciones y estructuras defoo.h
y deberían eliminar el error LNK2005.