Style GCC Слабо, связывающая в Visual Studio?
-
21-09-2019 - |
Вопрос
GCC обладает возможностью ослаблять символ связи с помощью __attribute__((weak))
. Анкет Я хочу использовать слабый символ в статической библиотеке, которую пользователи могут переопределить в своем приложении. Слабый символ в стиле GCC позволил бы мне сделать это, но я не знаю, можно ли это сделать с Visual Studio.
Предлагает ли Visual Studio аналогичная функция?
Решение
MSVC ++ имеет __declspec(selectany)
который охватывает часть функциональности слабых символов: он позволяет вам определять несколько идентичных символов с внешней связью, направляя компилятор выбрать любой из нескольких доступных. Тем не менее, я не думаю, что у MSVC ++ есть все, что охватило бы другую часть слабой функции символа: возможность предоставить «замену» определения в библиотеке.
Это, кстати, заставляет задуматься, как поддержка стандартной замены ::operator new
а также ::operator delete
Функции работают в MSVC ++.
Другие советы
Вы можете сделать это, вот пример в 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 использовался, чтобы вести себя так, чтобы, если символ определяется в файле .OBJ и .LIB он использовал бы тот, который в файле .OBJ без предупреждения. Я помню, что это также справится с ситуацией, когда символ определяется в нескольких LIBS, он использовал бы тот, который в библиотеке, названной первым в списке.
Я не могу сказать, что пробовал это через некоторое время, но я был бы удивлен, если они изменили это поведение (особенно это.
Нет эквивалента MS-VC этому атрибуту. Видеть http://connect.microsoft.com/visualstudio/feedback/details/505028/add-weak-funct-references-for-visual-cc. Анкет Я собираюсь предложить что -то ужасное: читать цель этого здесь: http://www.kolpackov.net/pipermail/notes/2004-march/000006.html По сути, определять функции, которые, если их символы существуют, используются, в противном случае не так, поэтому ...
Почему бы не использовать прецессор для этой цели, с огромным предостережением «Если вам вообще нужно это сделать»? (Я не фанат рекомендации допроцессора).
Пример:
#ifdef USE_MY_FUNCTION
extern void function();
#endif
затем правильно позвоните в логику приложения, окруженная #ifdef
заявления. Если ваша статическая библиотека связана, как часть связывания в процессе, настройте определение определения use_my_function.
Не совсем прямой эквивалент и очень уродливый, но это лучшее, о чем я могу думать.
Единственный способ, которым я знаю. Поместите каждый символ в отдельную библиотеку. Пользовательские объекты с переопределениями также должны быть объединены в библиотеку. Затем свяжите все вместе с приложением. Пользовательская библиотека должна быть указана в качестве входного файла, ваши LIB должны быть переданы в линкер, используя /DEFAULTLIB:
вариант.
Один из способов сделать это - реализовать его вручную через LoadLibrary а также GetProcadDress.