GCC имеет способность заставить символ связаться слабо через __attribute__((weak))
. Я хочу использовать слабый символ в статической библиотеке, которую пользователи могут переопределить в их приложении. Слабый символ стиля GCC позволил бы мне сделать это, но я не знаю, может ли он быть сделан с Visual Studio.
Visual Studio предлагает подобную функцию?
В MSVC++ есть __declspec(selectany)
, который покрывает часть функциональности слабых символов: он позволяет определить несколько одинаковых символов с внешней связью, направляя компилятор на выбор любого из нескольких доступных. Однако я не думаю, что в MSVC++ есть что-то, что покрывало бы другую часть функциональности слабых символов: возможность предоставлять "заменяемые" определения в библиотеке.
Это, BTW, заставляет задуматься, как в MSVC++ работает поддержка стандартных заменяемых функций ::operator new
и ::operator delete
.
Раньше MSVC вел себя так, что если символ определен в файле .obj и в .lib, то без предупреждения использовался символ из файла .obj. Я помню, что он также обрабатывал ситуацию, когда символ определен в нескольких библиотеках, он использовал тот, который был в библиотеке, названной первой в списке.
Не могу сказать, что пробовал это давно, но я был бы удивлен, если бы они изменили это поведение (особенно то, что символы, определенные в .obj, перекрывают символы в .lib файлах).
Для этого атрибута нет эквивалента MS-VC. См. http://connect.microsoft.com/VisualStudio/feedback/details/505028/add-weak-function-references-for-visual-c-c . Я собираюсь предложить нечто ужасное: прочтите его цель здесь: http://www.kolpackov.net/pipermail/notes/2004-March/000006.html , по сути, это определение функций, которые , если их символы существуют, используются, в противном случае - нет, так что ...
Почему бы не использовать для этой цели препроцессор с огромной оговоркой «если вам это вообще нужно»? (Я не любитель рекомендовать препроцессор).
Пример:
#ifdef USE_MY_FUNCTION
extern void function();
#endif
затем вызывается соответствующим образом в логике приложения в окружении операторов #ifdef
. Если ваша статическая библиотека связана, как часть процесса связывания, настройте определения, чтобы определить USE_MY_FUNCTION.
Не совсем прямой эквивалент и очень уродливый, но это лучшее, что я могу придумать.
Один из способов сделать это - реализовать это вручную через LoadLibrary и GetProcAddress .