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.

¿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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, hay otra manera de solucionar este error sin modificar foo.h. Una solución es utilizar la directiva #pragma once en bar.h y foobar.h también. De esta forma, si foo.h ya está incluido en bar.h, no se incluirá nuevamente en foobar.h. Otra solución es utilizar una guarda de inclusión en bar.h y foobar.h también, similar a la de foo.h. De esta forma, si foo.h ya está incluido en bar.h, no se incluirá nuevamente en foobar.h. Ambas soluciones evitan redefinir las funciones y estructuras de foo.h y deberían eliminar el error LNK2005.

Comments are closed.