Solo es posible por coincidencia.
Si las funciones f() y g() están en el mismo archivo de origen y no hay otras funciones en el archivo, y si g() nunca devuelve el puntero de función a f() a cualquiera de sus llamadores , luego hacer que f() static haga el trabajo.
Si otras funciones deben aparecer en el mismo archivo fuente, colocar f() en la parte inferior del archivo como una función estática y definir g() inmediatamente después de lograr más o menos el mismo efecto, aunque si no le dijiste al compilador que generara errores en 'declaraciones faltantes', otras funciones podrían llamarlo con advertencias.
#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();
}
Claramente, esta técnica no se puede ampliar de forma fiable a otro par de funciones en el mismo archivo - x() e y() - tal que x() y sólo x() puede llamar y(), mientras que g() y solo g() pueden llamar a f() al mismo tiempo.
Sin embargo, normalmente confiaría en la disciplina de los programadores y simplemente haría f() estática en el archivo fuente, junto con un comentario que solo g() podría llamarlo, y luego disciplinaría a cualquiera que modifique el código para que una función distinta de g() llama a f().
¿Estás seguro de que la pregunta era exactamente así? No tiene ningún sentido para mí. Quizás si se tratara de funciones miembro, entonces tal vez podría tener algún mérito, ¿pero funciones ordinarias? – Suma
@Suma: No habría funciones miembro en C. –