Насколько портативна слабая связь? #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()
для целей отладки, в то же время связываясь с библиотекой, которая их предоставляет.