Includi file h con definizioni all'interno di più file cpp [duplicato]
Il mio problema è che ho un file di intestazione (framework di test di unità personalizzato) con le definizioni delle funzioni. Ad esempio:
unit_test.h:
#pragma once
...
void Assert(bool b, const string& hint = {})
{
AssertEqual(b, true, hint);
}
...
è conveniente per me mantenere alcune funzioni definite proprio nell'intestazione, perché spesso uso questa funzione semplicemente includendo ( unit_test.h
si trova in una directory separata C:/Dev/include
).
Ma se ho a che fare con un progetto in cui più file cpp utilizzano questa funzionalità, ottengo un errore di definizione multipla come previsto.
Il progetto semplice è simile a:
main.cpp:
#include "unit_test.h"
void foo();
int main()
{
Assert(1);
foo();
return 0;
}
foo.cpp:
#include "unit_test.h"
void foo()
{
Assert(2);
}
Quindi voglio sapere se esiste un modo giusto per mantenere le definizioni di funzione in un file di intestazione e utilizzarlo nel progetto senza ottenere un errore di definizione multipla?
( O sarebbe meglio spostare le definizioni di funzione nel sorgente e compilarlo separatamente ogni volta, o compilare unit_test in una libreria statica? )
Risposte
Il modo più semplice per ottenerlo è aggiungere la inline
parola chiave nella definizione della funzione, ma non è la soluzione migliore.
L'opzione migliore è spostare la definizione nel file di origine, ma solo che non è un modello.
Userei lo spazio dei nomi anonimo con inline:
namespace {
inline void Assert(bool b, const string& hint = {})
{
AssertEqual(b, true, hint);
}
}
Questo errore è perché ogni volta che includerai il file, definirà nuovamente la funzione. La soluzione è creare un file di intestazione unit_test.h solo con dichiarazione e creare un file sorgente unit_test.cpp per la definizione. Ora puoi includere il file di intestazione che non darà errori. Non dimenticare di aggiungere #ifndef nell'intestazione come segue
unit_test.h
#ifndef UNIT_TEST_H_
#define UNIT_TEST_H_
// Declare you function
// and end with:
#endif