Все остальные дали вам канонический ответ «Вложенные функции не разрешены в стандарте C» (поэтому любое их использование зависит от вашего компилятора).
Ваш исправленный пример:
double stuff(double a, double b)
{
struct parameters
{
double a, b;
};
double f(double x, void * params)
{
struct parameters p = (struct parameters *) params;
double a = p->a, b = b->b;
return some_expression_involving(a,b,x);
}
struct parameters par = {a,b};
return integrate(&f, &par); // return added!
}
Поскольку вы говорите, что такие функции, как интегратор, необходимы
double (*f)(double x, void * par);
Я не понимаю, зачем вам вообще нужны вложенные функции. Я ожидал бы написать:
struct parameters
{
double a, b;
};
static double f(double x, void *params)
{
struct parameters p = (struct parameters *) params;
double a = p->a, b = b->b;
return some_expression_involving(a,b,x);
}
double stuff(double a, double b)
{
struct parameters par = { a, b };
return integrate(f, &par);
}
Приведенный выше код должен работать в C89 (если только не возникает проблема с инициализацией 'par') или в C99; эта версия кода предназначена только для C99 с использованием составного литерала для параметра (раздел 6.5.2.5 Составные литералы):
double stuff(double a, double b)
{
return integrate(f, &(struct parameters){a, b});
}
Скорее всего, у вас есть всего несколько вариаций типа "параметры структуры". Вам необходимо предоставить отдельные (достаточно) значимые имена для различных функций - у вас может быть только одна функция с именем 'f
' на исходный файл.
Единственное незначительное преимущество версии с вложенными функциями заключается в том, что вы можете быть уверены, что никакая другая функция, кроме stuff
, не вызывает f
. Но, учитывая пример кода, это не главное преимущество; статическое определение f
означает, что никакая функция вне этого файла не может вызвать его, если не передан указатель на функцию.