Возможно только по совпадению.
Если функции f () и g () находятся в одном и том же исходном файле, и в этом файле нет других функций, и если g () никогда не возвращает указатель функции на f () любому из ее вызывающих, тогда выполнение f () static сделает всю работу.
Если другие функции должны появиться в том же исходном файле, поместите f () внизу файла как статическую функцию и определите только g () сразу после того, как это достигнет более или менее того же эффекта - хотя если вы не говорил компилятору генерировать ошибки в «пропущенных декларациях», другие функции могли вызывать его с предупреждениями.
#include <stdio.h>
extern void g(void); /* in a header */
/* Other functions that may not call f() go here */
static void f(void)
{
puts("X");
}
void g(void)
{
f();
}
Очевидно, что этот метод нельзя надежно распространить на другую пару функций в том же файле - x () и y () - так что x () и только x () могут вызывать y (), тогда как g () и только g () может вызывать f () одновременно.
Однако обычно вы полагаетесь на дисциплину программистов и просто делаете f () статическим в исходном файле вместе с комментарием, который может вызывать только g (), а затем дисциплинируете любого, кто модифицирует код так, чтобы функция, отличная от g (), вызывает f ().