2012-03-13 16 views
16

Tengo que vincular dos bibliotecas, por ejemplo, A y B. Algunos de los archivos son comunes en ambas bibliotecas. Entonces, declaro funciones en la biblioteca A dentro de un espacio de nombres, diga abc. Así, en A y B, una función func se parece a continuación:C++: Funciones de Extern C dentro de un Namespace

[ in A] 

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


[in B] 

    extern "C" void func(); 

Mientras que la construcción del proyecto, el compilador genera errores que unen diciendo múltiples definiciones de la función func. ¿No está la función func en A dentro del espacio de nombres o hay algún problema con las funciones externas "C"? Si lo hay, ¿cómo puedo diferenciarlos a los dos?

Respuesta

23

Cuando utiliza Extern "C", está desactivando el cambio de nombre para que pierda la información del espacio de nombres, ya que C no tiene ese concepto. Esto causa una definición duplicada.

+1

Tenga en cuenta, sin embargo, que el mangle del nombre no se puede desactivar para el preprocesador C. En Visual C++ 2010, el valor de la macro '__FUNCTION__' sigue siendo el identificador totalmente calificado incluso bajo 'extern' C" ', p. "tu nombre". Esto caerá en tus pies cuando llames a macros en espacios de nombres que usan macros predefinidas como '__FUNCTION__',' __PRETTY_FUNCTION__' o '__func__'. En mi caso (exportando stubs C desde una DLL) lo hizo ;-) –