【发布时间】:2016-06-09 20:33:59
【问题描述】:
我对一些结合函数指针和函数声明的C++语法理解有问题,即:
通常当我们想要声明一种函数类型时,我们会做这样的事情:
typedef void(*functionPtr)(int);
这对我来说很好。从现在开始 functionPtr 是一个类型,它表示 指向函数的指针,该函数返回 void 并将 int 值作为参数。
我们可以这样使用它:
typedef void(*functionPtr)(int);
void function(int a){
std::cout << a << std::endl;
}
int main() {
functionPtr fun = function;
fun(5);
return 0;
}
我们会在屏幕上打印5。
我们有指向函数fun 的指针,我们将一些现有的指针分配给函数-function,并通过指针执行该函数。很酷。
现在,正如我在一些书中看到的那样,函数和函数指针在某种程度上被视为相同,所以实际上在声明 function() 函数之后,每次我们说函数时,我们的意思是真正的函数和指向函数的指针具有相同的类型,所以以下编译,每条指令都给出相同的结果(屏幕上打印 5 个):
int main() {
functionPtr fun = function;
fun(5);
(*fun)(5);
(*function)(5);
function(5);
return 0;
}
所以现在只要我能想象,指向函数和函数的指针几乎相同,那么对我来说就很好了。
那么我虽然,如果指向函数的指针和真正的函数是相同的,那为什么我不能做以下:
typedef void(functionPtr)(int); //removed *
void function(int a){
std::cout << a << std::endl;
}
int main() {
functionPtr fun = function;
fun(5);
return 0;
}
这给了我以下错误:
prog.cpp:12:14:警告:“void fun(int)”的声明具有“extern”并已初始化 functionPtr fun = 函数;
因此我明白了,由于某种原因,编译器现在明白了,有趣的是已经存在功能。然后我尝试了以下操作:
int main() {
functionPtr fun;
fun(5);
return 0;
}
我得到了链接错误。我以某种方式理解,由于编译器现在将 fun 视为已经存在的函数,因此由于 fun 没有被定义,我会得到链接错误。因此我更改了变量的名称:
typedef void(functionPtr)(int);
void function(int a){
std::cout << a << std::endl;
}
int main() {
functionPtr function;
function(5);
return 0;
}
所以现在函数在主阴影全局名称函数中,所以 function(5) 是从声明 functionPtr function; 中使用的,它工作正常并在屏幕上打印 5。
所以现在我很震惊。为什么会这样?同样令人误解的是,当函数指针这样声明时:
typedef void(*functionPtr)(int);
我可以通过以下方式创建 functionPtr 类型的函数:
functionPtr function(int a){
std::cout << a << std::endl;
}
然而,当声明类似:
typedef void(functionPtr)(int);
做这个:
functionPtr function(int a){
std::cout << a << std::endl;
}
被编译器解释为函数返回函数。如果是这样,为什么之前的声明 (typedef void(functionPtr)(int);) 知道这是一个返回 void 的函数而不是返回 functionPtr 的函数?
有人可以为我解释一下引擎盖下到底发生了什么吗?
我正在使用启用了 C++14 选项的 g++ C++ 编译器。
【问题讨论】:
标签: c++ function pointers typedef