C++ 函数指针类型不能用于函数原型

C++ 函数指针类型不能用于函数原型,c++,c,visual-c++,function-pointers,function-prototypes,C++,C,Visual C++,Function Pointers,Function Prototypes,我想知道为什么以下代码段不起作用: typedef void (*MYFUNC_PTR)(int a); MYFUNC_PTR myFunc; void myFunc(int a) { } 我正在使用Microsoft Visual Studio 2017。源文件是“.c”,但我用“.cpp”尝试了相同的方法。我得到的错误是 Error C2365 'myFunc': redefinition; previous definition was 'data variable' 注

我想知道为什么以下代码段不起作用:

typedef void (*MYFUNC_PTR)(int a);
MYFUNC_PTR myFunc;

void myFunc(int a)
{

}
我正在使用Microsoft Visual Studio 2017。源文件是“.c”,但我用“.cpp”尝试了相同的方法。我得到的错误是

Error   C2365   'myFunc': redefinition; previous definition was 'data variable' 
注意:我假设这段代码可以工作,因为微软提到了一个类似的代码片段(在我测试该代码时,它也不工作),例如


<>编辑:我想这也许只适用于一个新的C++标准,但这也不是事实,因为我尝试了C++ 17。

< p>一个函数指针与函数声明不一样,所以这根本不起作用。但是,您可以这样做:

typedef void(*MYFUNC_PTR)(int a);
MYFUNC_PTR myFunc;

void someFunc(int a)
{

}

int main() {
    myFunc = someFunc;
    return 0;
}

问题在于
myFunc
的类型是函数指针,而不是函数。之后,您将
myFunc
定义为一个函数(,当然),它们不匹配

您可以将
MYFUNC\u PTR
typedef
更改为函数,然后

typedef void(MYFUNC_PTR)(int a);
MYFUNC_PTR myFunc;
void myFunc(int a)
{

}

在单个作用域中不能有名称相同的变量和函数您已声明了名为
myFunc
的指针变量,然后尝试定义具有相同名称的函数。这是名字冲突。这和做:
intf后跟
intf(void){}
。具有相同名称的变量和函数。冲突。我确实考虑了TyPulf是一个函数指针的事实,但是我很困惑,因为微软推荐了这个。@ PitoMr-微软在文档中犯了一个错误。或者可能是为了让文档正确,但最终以另一种方式编写代码。不管怎样,这都是他们自己的错误。@PhantomR Microsoft不建议这样做,他们只是在文档中输入了一个错误。在其他描述回调的文档中,它们没有同时显示变量声明和函数声明,就像您的链接文档一样。我在看到错误后也这么认为,但Microsoft推荐这种构造的事实让我困惑。事实上,我也发现这是可行的。遗憾的是,微软只为某些函数类型提供了“P”(指针)变体。我不明白他们为什么说原来的建筑会起作用。。