PDA

Visualizza la versione completa : [C++] Evitare duplicazione delle inclusioni


giuseppe500
16-01-2011, 09:59
ciao.

ho la seguente inclusione

#include "Float1.h"
#include "Float2.h"
#include "Float3.h"
#include "Float4.h"

vorrei trovare un metodo per non duplicare le inclusioni.
Nel file cpp ho utilizzato lo stadfx.h dove ho incluso tutte le classi .h utilizzate dal progetto.
e nel file .h quello che mi serviva al momento.
Il problema che se in un file cpp ci sono 2 o piu file .h con

#include "Float1.h"
#include "Float2.h"
#include "Float3.h"
#include "Float4.h"

duplicazione!!!!

GliderKite
16-01-2011, 11:23
Forse non ho ben capito il tuo problema, tuttavia se cosi non fosse prova cosi: nei tuoi headers che vuoi includere dovrai indicare al preprocessore compile-time che andranno inclusi una e una sola volta, sebbene la direttiva #include compaia pi volte.

1) Soluzione

#ifndef FLOAT1_H
#define FLOAT1_H

// Resto di "Float1.h"

#endif



2) Soluzione

#pragma once

// Resto di "Float1.h"




:ciauz:

giuseppe500
16-01-2011, 11:43
no , mi spiego meglio:
guarda i Float4:
[code]
#pragma once
#include "PgeCoreLib.h"
#include "Float4.h"
#include <atlcomcli.h>
namespace PGE{

class WM4_PGECORE_ITEM CBaseEffect
{
public:
CBaseEffect(void);
~CBaseEffect(void);
ID3D11VertexShader * GetVShader();
ID3D11PixelShader * GetPShader();
void Setlayout(ID3D11InputLayout* pLayout);
ID3D11InputLayout * GetLayout();
Float4 Getxxx();
void SetStride(int stride);
protected:
ID3D11VertexShader* m_pVShader;
ID3D11PixelShader* m_pPShader;
CComPtr<ID3D11Device> m_pDevice;
ID3D11InputLayout* m_pLayout;
//size del vertice
int m_stride;
};
typedef boost::shared_ptr<CBaseEffect> ptrBaseEffect;

}
[code]

se ho un altro header che deve includere la classe Float4 perch la usa nella definizione e una terza classe deve includere le due classi precedenti, ho incluso il float4 due volte we ho un errrore,


Utilizzo un sistema cosi strutturato:
Ho vari progetti separati ed un eseguibile.
Nei vari progetti ho un file headers.h in cui metto tutti gli .h del progetto.
In tutti i file .cpp includo questo headers.h.
Alla fine della compilazione i vari progetti creano un file .lib e una dll .
copio questi due file in una directory comune Lib e copio tutti i .h del progetto in una directory comune Include dei vari progetti.

Il problema sono i .h , se ho bisogno per una definizione di una classe la devo includere e quindi viene inclusa due volte.

Volevo risolvere con la direttiva
class CClasseInclusa
prima della definizione della classe che devo creare , ma uso degli smartpointers e nelle definizione non devo utilizzare la classe , bensi lo smart pointer, altrimenti se uso la classe non mi servono a niente.

questo l'errore che mi salta fuori:
Error 21 error C2011: 'PGE::CMesh' : 'class' type redefinition c:\pgn2010\trunk\include\Mesh.h 8

lolide
16-01-2011, 15:19
Se hai una classe o qualsiasi altra definizione che viene ripetuta in altri sorgenti e ti da errore, allora devi riorganizzare meglio gli header.

Ti sconsiglio #pragma once, o meglio una direttiva del compilatore microsoft, non standard.

Il modo migliore la soluzione 1 suggerita da GliderKite.

Se una classe, ad esempio, ti da errore che ridefinita, allora la sposti in un nuovo header, propriamente organizzato (non frammentando brutalmente il codice ovviamente), e lo includi dove ti serve.

Loading