Да, они применяются.Статические функции - это просто простые функции с видимостью единиц измерения.ABI - это задача генерации компилятора, стандарт C специально об этом ничего не говорит.Это становится понятным при удалении слова static
из вашего кода.Аргументация та же.Недостаток при таком подходе заключается в том, что компилятор не может проверить право связи (вызывающий-вызываемый), а только его тип (void (*ret_function_t)(int,int);
) во время компиляции, поскольку вы тот, кто ссылается во время выполнения.Таким образом, это не рекомендуется.
В результате ваш компилятор сгенерирует код для любой вызывающей функции, следуя некоторому ABI, и назовем его ABI-a.И он сгенерирует код для функции, вызываемой согласно некоторому другому ABI, скажем, ABI-b.Если ABI-a == ABI-b , это всегда работает, и это так, если вы компилируете оба файла с одинаковым ABI.
Например, это работает, если prnt
Функция была расположена по адресу 0x12345678
:
ret_function_t gl_fp = (ret_function_t)0x12345678;
. Она также работает, пока есть функция с правильными аргументами в 0x12345678
.Как видите, функция не может быть inline
d, поскольку компилятор не знает, какое определение функции окажется в этой области памяти, их может быть много.