2012-03-13 29 views
16

Devo collegare due librerie, ad esempio A e B. Alcuni file sono comuni in entrambe le librerie. Quindi, dichiaro le funzioni nella libreria A all'interno di un namespace, ad esempio abc. Così, in A e B, una funzione func si presenta come di seguito:C++: funzioni Extern C all'interno di uno spazio dei nomi

[ in A] 

    namespace abc { 
    extern "C" void func(); 
    } 


[in B] 

    extern "C" void func(); 

Mentre la costruzione del progetto, compilatore genera errori che collegano dicendo più definizioni della funzione func. Non è la funzione func in A all'interno del namespace o c'è qualche problema con le funzioni "C" esterne. Se c'è, allora come posso differenziarli entrambi?

risposta

23

Quando si utilizza la "C" di Extern, si sta disattivando il nome di manomissione in modo da perdere le informazioni sullo spazio dei nomi poiché C non ha tale concetto. Ciò causa una definizione duplicata.

+1

Nota, tuttavia, il nome mangling non può essere disattivato per il preprocessore C. In Visual C++ 2010 il valore della macro '__FUNCTION__' rimane l'identificatore pienamente qualificato anche in" extern "C" ', ad es. "il tuo nome". Questo cadrà in piedi quando si chiamano macro in spazi dei nomi che utilizzano macro predefinite come '__FUNCTION__',' __PRETTY_FUNCTION__' o '__func__'. Nel mio caso (esportando gli stub C da una DLL) lo ha fatto ;-) –

Problemi correlati