Сейчас проектирую API для *****, (тут было много буков, но я всё стёр). И возникла мысль что довольно много функций по сути нужны только один раз и в одном единственном месте, но их надо проверять/тестировать, а для этого либо объявлять их в заголовочных файлах, но это замусоривает их, либо объявлять в исходниках тестов, но я иногда меняю именования целых блоков функций после тестового прогона в виде юзабилити написания на этом API. Короче подумалось что по сути можно использовать вложенные функции и не просто вызывать их внутри основной, а возвращать и вызывать уже в тесте отсекая ошибки которые могли бы возникнуть если бы я делал по иному то есть вызывал бы вложенную функцию через какойнить аргумент «родительской» типа так
#include <stdio.h>
#include <stdbool.h>
void foo(bool flag)
{
    void bar()
    {
        printf("hello\n");
    }
    void mar()
    {
       printf("world\n");
    }
    (flag)?bar():mar();
}
int main()
{
   foo(true);  // вызов bar();
   foo(false); // вызов mar();
   return 0;
}
А подумал что будет довольно удобно вот так
#include <stdio.h>
#include <stdbool.h>
void * foo(bool opt)
{
  void(*p)() = NULL;
  void one()
  {
    printf("some work one\n");
  }
  void twoo()
  {
    printf("some work twoo\n");
  }
    return (opt)?(p=one):(p=twoo);
}
int main()
{
    void(*func)() = NULL;
    func = foo(true);
    func();
    func = foo(false);
    func();
    return 0;
}
Но я плохо понимаю как это в памяти будет, как бы функция в стеке и вложенная тоже, что если у меня их будут сотни и внутри вложенных будут static переменные/структуры/объединения, а то и массивы. Вообщем вопрос, что я могу огрести от подобного? (От второго варианта с возвратом указателя на вложенную функцию)
Компилироваться всё это бeдет для linux/windows/android/darwin/wasm








