Здравствуйте, Fedor Sumkin, Вы писали:
FS>Почему сейчас код работает(gcc 4.5.1), а если раскомментировать доп. блоки не будет работать?
FS>FS>//...
FS>void bar(double(double) f, double p1)
FS>//...
FS>
Потому, что неправильно объявлен первый формальный параметр функции
bar. Правильно так
void bar(double f(double), double p1);
После этого исправления программа компилируется и выполняется успешно:
http://ideone.com/Y6Rcx.
FS>Как такое возможно(особенно запись double(double)) и как такое соотносится с компиляторами и стандартом?
Нормальная запись, которая обозначает тип функции с одним параметром типа
double и типом возвраемого значения
double. Запись
double(double) — это "голый" тип, без идентификатора. Добавлять идентификатор, если он понадобится, в этом случае нужно не в конец записи, а перед скобкой:
double foo(double);
Только нужно учитывать, что параметры-функции по стандарту автоматически трактуются компилятором как указатели на функции. Следующие объявления эквивалентны:
void bar(double f(double), double p1);
void bar(double (*f)(double), double p1);