2009-09-11 4 views
2

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

#pragma weak my_symbol 

Я вижу, что вопрос: how-to-make-weak-linking-work-with-gcc обсуждается, как заставить его работать. Но есть ли хороший способ сделать это, чтобы gcc не требовался?

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

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

ответ

12

#pragma, по определению, не переносимым.

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

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

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