Это довольно простой вопрос, который делает меня немного любопытным. Рассмотрим следующий фрагмент кода:
#include <iostream>
int three()
{
return 3;
}
void foo(int func(void))
{
std::cout << func() << std::endl;
}
void bar(int (*func)(void))
{
std::cout << func() << std::endl;
}
int main()
{
foo(three);
bar(three);
return 0;
}
// output:
// 3
// 3
Как видите, у нас есть две функции, которые в качестве единственного аргумента принимают другую функцию. Однако функции прототипов для них различаются. В основном у нас есть void foo(int func(void))
и void bar(int (*func)(void))
. На первый взгляд кажется, что foo
получает саму функцию, а bar
получает указатель на функцию.
Однако оба они дают одинаковые результаты, имеют одинаковое тело и вызываются одинаково.
У меня вопрос, есть ли действительно скрытая разница между foo
и bar
? Это просто необязательный синтаксис в C ++? Один из двух случаев считается "плохим стилем" в C ++?
Если мой компилятор является фактором, я использую Visual Studio 2010.