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