Насколько портативна слабая связь? #pragma слабый my_symbol - PullRequest
2 голосов
/ 11 сентября 2009

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

#pragma weak my_symbol

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

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

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

1 Ответ

13 голосов
/ 11 сентября 2009

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

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

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

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

...