Errore del linker per avere funzione non Inline definito nel file di intestazione?
-
21-08-2019 - |
Domanda
funzione non inline definita nel file di intestazione con le guardie
#if !defined(HEADER_RANDOM_H)
#define HEADER_RANDOM_H
void foo()
{
//something
}
#endif
I risultati in errore di linker: già definito nel file di someother.obj Rendere la funzione inline funziona bene, ma io non sono in grado di capire il motivo per cui la funzione è già erroring nel primo caso.
Soluzione
Se l'intestazione è incluso in più di un file di origine e la funzione non è contrassegnato come "in linea" si avrà più di una definizione. Il comprendono guardie impediscono solo più inclusioni nello stesso file sorgente.
Altri suggerimenti
Si sta violando la regola una sola definizione . Se si vuole definire una funzione direttamente nell'intestazione, è necessario contrassegnare come inline
- che permetterà la funzione da definire più volte. Si noti inoltre che <=> non ha altro significato, in particolare non forza il compilatore inline chiamate (contrariamente alla credenza popolare).
Dato che non è in linea, ciascuna unità di traduzione avrà la propria copia della funzione risultante nella funzione essendo definito più volte.