GCC разрабатывают слабое соединение в Visual Studio?

GCC имеет способность заставить символ связаться слабо через __attribute__((weak)). Я хочу использовать слабый символ в статической библиотеке, которую пользователи могут переопределить в их приложении. Слабый символ стиля GCC позволил бы мне сделать это, но я не знаю, может ли он быть сделан с Visual Studio.

Visual Studio предлагает подобную функцию?

40
задан deft_code 18 February 2010 в 17:21
поделиться

4 ответа

В MSVC++ есть __declspec(selectany), который покрывает часть функциональности слабых символов: он позволяет определить несколько одинаковых символов с внешней связью, направляя компилятор на выбор любого из нескольких доступных. Однако я не думаю, что в MSVC++ есть что-то, что покрывало бы другую часть функциональности слабых символов: возможность предоставлять "заменяемые" определения в библиотеке.

Это, BTW, заставляет задуматься, как в MSVC++ работает поддержка стандартных заменяемых функций ::operator new и ::operator delete.

17
ответ дан 27 November 2019 в 01:14
поделиться

Раньше MSVC вел себя так, что если символ определен в файле .obj и в .lib, то без предупреждения использовался символ из файла .obj. Я помню, что он также обрабатывал ситуацию, когда символ определен в нескольких библиотеках, он использовал тот, который был в библиотеке, названной первой в списке.

Не могу сказать, что пробовал это давно, но я был бы удивлен, если бы они изменили это поведение (особенно то, что символы, определенные в .obj, перекрывают символы в .lib файлах).

11
ответ дан 27 November 2019 в 01:14
поделиться

Для этого атрибута нет эквивалента 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.

Не совсем прямой эквивалент и очень уродливый, но это лучшее, что я могу придумать.

3
ответ дан 27 November 2019 в 01:14
поделиться

Один из способов сделать это - реализовать это вручную через LoadLibrary и GetProcAddress .

0
ответ дан 27 November 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: