см. стандарт пункт 6.7.4 и далее по тексту. там про extern для функций написано
Насколько я понял там все на inline завязано. Я определил функцию foo с inline, в этой же единице трансляции сделал объявление этой же функции с extern, и тогда, если foo будет использоваться в этой единице трансляции, то компилятор попробует ее сделать inline, если вызов foo будет в другой единице трансляции, то компилятор не будет делать ее inline