Вопрос

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top