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

StackOverflow https://stackoverflow.com/questions/1410811

Вопрос

Насколько мобильна слабая связь?

#pragma weak my_symbol

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

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

#ifndef my_weak_fn
    void my_weak_fn(){/* Do nothing */ return;}
#endif
Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top