Насколько портативна слабая связь? #pragma слабый my_symbol

Насколько портативна слабая связь?

#pragma weak my_symbol

Я вижу этот вопрос: как сделать, чтобы слабые ссылки работали с gcc, обсуждает, как заставить это работать. Но есть ли хороший способ сделать это так, чтобы gcc не требовался?

В чем разница между слабым связыванием и защитой объявления с помощью #ifdef?

#ifndef my_weak_fn
    void my_weak_fn(){/* Do nothing */ return;}
#endif

1 ответ

Решение

#pragma по определению не является переносимым.

И слабое связывание выполняется во время соединения (что удивительно). Это позволяет функции (или любому другому символу) с такой же сигнатурой переопределять другую. Это означает, что сильный будет выбран предпочтительнее слабого, но если нет сильного, будет использован слабый.

Охрана включения выполняется компилятором, а не компоновщиком, и они не допускают отступления к слабому, если сильного нет. Вы можете смоделировать то же поведение, если вы контролируете источник для обеих функций (с помощью ifdefна одного, ifndefдля другого), но это не всегда так, и это больше выбор между двумя сильными функциями.

Слабая связь позволяет вам сделать что-то наподобие malloc()/free() для целей отладки, в то же время связываясь с библиотекой, которая их предоставляет.

Другие вопросы по тегам