Сейчас проектирую 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