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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top