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”(指针)变体。我不明白他们为什么说原来的建筑会起作用。。