Includi file h con definizioni all'interno di più file cpp [duplicato]

Aug 21 2020

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.hsi 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

1 KrzysztofMochocki Aug 21 2020 at 17:43

Il modo più semplice per ottenerlo è aggiungere la inlineparola 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.

1 Nikola Aug 21 2020 at 18:00

Userei lo spazio dei nomi anonimo con inline:

namespace {
    inline void Assert(bool b, const string& hint = {})
    {
        AssertEqual(b, true, hint);
    }
}
Imran Aug 21 2020 at 18:12

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