¿Estilo de enlace débil de GCC en Visual Studio?

GCC tiene la capacidad de hacer un enlace de símbolo débilmente mediante __attribute__((weak)) . Quiero utilizar un símbolo débil en una biblioteca estática que los usuarios pueden anular en su aplicación. Un símbolo débil de estilo GCC me permitiría hacer eso, pero no sé si se puede hacer con Visual Studio.

¿Visual Studio ofrece una característica similar?

MSVC ++ tiene __declspec(selectany) que cubre parte de la funcionalidad de los símbolos débiles: le permite definir múltiples símbolos idénticos con un enlace externo, ordenando al comstackdor que elija cualquiera de los muchos disponibles. Sin embargo, no creo que MSVC ++ tenga nada que cubra la otra parte de la funcionalidad de símbolo débil: la posibilidad de proporcionar definiciones “reemplazables” en una biblioteca.

Esto, por cierto, hace que uno se pregunte cómo funciona el soporte para las funciones de reemplazo estándar ::operator new y ::operator delete en MSVC ++.

Puedes hacerlo, aquí hay un ejemplo en C:

 /* * pWeakValue MUST be an extern const variable, which will be aliased to * pDefaultWeakValue if no real user definition is present, thanks to the * alternatename directive. */ extern const char * pWeakValue; extern const char * pDefaultWeakValue = NULL; #pragma comment(linker, "/alternatename:_pWeakValue=_pDefaultWeakValue") 

MSVC solía comportarse de tal manera que si un símbolo se define en un archivo .obj y .lib, usaría el que está en el archivo .obj sin previo aviso. Recuerdo que también manejaría la situación donde el símbolo está definido en múltiples libs, usaría el de la biblioteca nombrada primero en la lista.

No puedo decir que lo intenté hace tiempo, pero me sorprendería si cambiaran este comportamiento (especialmente que los símbolos definidos .obj anulan los símbolos en los archivos .lib).

No hay un MS-VC equivalente a este atributo. Consulte http://connect.microsoft.com/VisualStudio/feedback/details/505028/add-weak-function-references-for-visual-cc . Voy a sugerir algo horrible: leyendo el propósito aquí: http://www.kolpackov.net/pipermail/notes/2004-March/000006.html es esencialmente para definir funciones que, si sus símbolos existen, se utilizan, de lo contrario, no son, entonces …

¿Por qué no usar pre-procesador para este propósito, con la gran advertencia de “si necesitas hacer esto en absoluto”? (No soy partidario de recomendar pre-procesador).

Ejemplo:

 #ifdef USE_MY_FUNCTION extern void function(); #endif 

luego llame apropiadamente en la lógica de la aplicación, rodeado por declaraciones #ifdef . Si su biblioteca estática está vinculada, como parte del proceso de vinculación, modifique las definiciones para definir USE_MY_FUNCTION.

No es exactamente un equivalente directo y muy feo, pero es lo mejor que se me ocurre.

La única forma que conozco Coloque cada símbolo en una biblioteca separada. Los objetos de usuario con anulaciones también se deben combinar con la biblioteca. Luego, vincula todo junto a una aplicación. La biblioteca de usuario debe especificarse como archivo de entrada, su lib debe transferirse al enlazador utilizando la opción /DEFAULTLIB: .

Una forma de hacerlo sería implementarlo manualmente a través de LoadLibrary y GetProcAddress .