2010-09-21 14 views
7

Ho uno spazio dei nomi con funzione inline che verrà utilizzato se diversi file di origine. Quando si tenta di collegare la mia applicazione, la funzione inline viene segnalata come simboli duplicati. Sembra che il mio codice semplicemente non incorpori le funzioni e mi chiedevo se questo è il comportamento previsto e come gestirlo al meglio.La funzione inline nello spazio dei nomi genera simboli duplicati durante il collegamento su gcc

ho utilizzate le seguenti opzioni: gcc-g -Wextra -pedantic -Wmissing-field-inizializzatori -Wredundant-decls -Wfloat-uguale--Wno riordino--Wno-lunga lunga Lo stesso stile codice sembra per compilare e collegare correttamente quando si costruisce in un ambiente VC7.

Nell'esempio di codice seguente mostra la struttura del codice:

/* header.h */ 
namespace myNamespace { 
inline bool myFunction() {return true;} 
} 

/* use_1.cpp */ 
#include "header.h" 
... 
bool OK = myNamespace::myFunction(); 
... 

/* use_2.cpp */ 
#include "header.h" 
... 
bool OK = myNamespace::myFunction(); 
... 
+1

OK una variabile globale in ogni file cpp? Ciò causerebbe un errore di simbolo duplicato. Supponendo che non sia globale, il tuo esempio è C++ legale. Prova a compilare con -Winline. Quale versione di gcc stai usando? –

+1

Si prega di inviare il messaggio del compilatore attuale. L'errore si verifica con file di origine minimi (solo le righe menzionate senza le cose implicite da ...)? –

+1

Una volta cambiato uno dei nomi di 'OK' in' OK1', ho aggiunto una funzione 'main' vuota e rimosso' ... '; la compilazione di entrambi i file con le opzioni fornite ha funzionato correttamente per me. È necessario inviare ulteriori dettagli in quanto la causa del tuo errore non è qui. –

risposta

-1

La parola linea è preso solo come un suggerimento dal compilatore. Se il compilatore decide che la funzione sarebbe più performante senza inline, non la in linea. Esistono parole chiave specifiche del fornitore che rendono il compilatore in linea una funzione: è __attribute__((always_inline)) per GCC e __forceinline per Visual C++.

Se si vuole veramente assicurarsi che la propria funzione non causi errori di linker in tutti i casi su tutti i compilatori standard, è possibile renderla basata su modelli, in quanto è garantito che le funzioni basate su modelli non causano errori di linker anche se definite nelle intestazioni . Questo, tuttavia, è del tutto inutile per funzioni davvero semplici.

+2

Il tuo codice non causa errori di linker se lo scrivi correttamente. Scrivere modelli dove non sono necessari è una sciocchezza. –

+1

Se un compilatore C++ inline una funzione o meno non è importante qui. Il compilatore lo gestisce in modo trasparente sotto la regola as-if. Tuttavia 'inline' influenza la semantica del programma. È appropriato qui indipendentemente dal fatto che il compilatore in realtà inline la funzione. Si prega di ricercare la "regola della definizione unica". – sellibitze

+0

RISOLTO: Finalmente ho avuto il tempo di rintracciare il problema alle sue radici e (come così spesso) era un semplice problema di coerenza con l'uso di intestazioni precompilate. Ho appreso che l'uso di inline è in effetti trasparente e non richiede di fare attenzione se il compilatore fa effettivamente in linea la funzione o meno. E la cosa più importante: usa sempre il flag -Winvalid-pch quando usi le intestazioni precompilate. – doberkofler

Problemi correlati