Атрибутом __weak в IDE IAR снабжают функцию-заглушку, которую может переопределить пользователь в своем коде, чтобы поменять её по своему усмотрению. Эту возможность широко используют многие библиотеки, в частности CMSIS и HAL. Компилятор GCC также поддерживает атрибут weak.
Использование атрибута __weak для объекта на внешней декларации символа делает "слабыми" (weak) все ссылки на этот символ, и он помещается в модуль weak.
Использование атрибута __weak для объекта при его публичном определении делает это определение "слабым", которое можно переопределить.
Линкер не будет включать модуль из библиотеки исключительно для удовлетворения слабых ссылок на символ, а отсутствие определения для слабой ссылки не приведет к ошибке. Если не было добавлено определение, то адрес объекта будет нулевой.
При линковке у символа может быть любое количество weak-определений, и не более одного не-weak определения. Если символ необходим, и существует не-weak определение, то это не-weak определение будет использовано. Если нет не-weak определения, то будет использовано одно из weak-определений.
Пример:
extern __weak int foo; /* Декларация weak-функции */
__weak void bar(void) /* Определение weak-функции */
{
/* Инкремент переменной foo, если она существует. */
if (&foo != 0)
++foo;
}
[Ссылки]
1. IAR C/C++ Development Guide Twenty-fourth edition: June 2018 site:supp.iar.com. |