Компилятор выдает ошибку "expected expression before ‘void’" - почему? - C (СИ)
Формулировка задачи:
void foo(void (*callback)()){
нечто();
callback();
еще_одно_нечто();
}
а в майне:
foo(void bar(void){
printf("hello\n");
});Решение задачи: «Компилятор выдает ошибку "expected expression before ‘void’" - почему?»
textual
Листинг программы
#include <stdio.h>
void foo() {
printf("i'm foo\n");
}
void bar(void (*baz)()) {
printf("i'm bar\n");
baz();
}
int main(void)
{
bar(foo);
void car(void (*tar)()) {
tar(foo);
};
car(bar);
return 0;
}
Объяснение кода листинга программы
Код представляет собой небольшую программу на языке C, которая содержит несколько функций. Основная функция — main(), которая инициирует вызов других функций.
- Функция main() инициирует вызов функции
bar(), передавая в качестве аргумента функциюfoo(). - Функция bar() принимает указатель на функцию в качестве аргумента. Затем она выводит сообщение
i'm barи вызывает функцию, на которую указывает переданный ей указатель. - Функция foo() просто выводит сообщение
i'm foo. - Функция main() также содержит функцию
car(), которая объявлена внутри неё. Эта функция также принимает указатель на функцию в качестве аргумента. Внутри функцииcar()вызывается переданная ей функция, и в качестве аргумента передаётся функцияbar(). Ошибка компиляцииexpected expression before ‘void’возникает из-за того, что функцияcar()объявлена какvoid, то есть она не возвращает значение, но должна иметь выражение перед объявлением. Кроме того, функцияcar()объявлена внутри функцииmain(), и её область видимости ограничена этой функцией. Это означает, что вызов функцииcar()в строкеcar(bar);за пределами функцииmain()будет ошибочным, так как функцияcar()не будет видна в этом контексте.