c++中作为参数的函数指针
Function pointers as parameters in C++?
我对函数指针的参数形式感到困惑。以下两个:
int fun(int (*g)())
{
cout << g() << endl;
}
int fun(int g())
{
cout << g() << endl;
}
这两个定义都很好。但是正如您所注意到的,这两个函数的原型有一些不同之处:
- 第一个参数为
int (*g)()
, - ,第二个取参数
int g()
。
我的问题是它们之间有什么区别吗?
在第二种情况下,函数类型调整为指针指向函数类型,这使得两个函数相同。
int fun(int (*g)());
int fun(int g()); //same as above, after type adjustment
c++ 03标准在§13.1/3中说,
形参声明的不同之处在于一个是函数类型,另一个是指向同一函数类型的指针,它们是等效的。即,将函数类型调整为指向函数类型(8.3.5)的指针。
[Example:
void h(int());
void h(int (*)()); // redeclaration of h(int())
void h(int x()) { } // definition of h(int())
void h(int (*x)()) { } // ill-formed: redefinition of h(int())
]
这与数组到指针的调整相同,我们更熟悉:
int fun(int *a);
int fun(int a[]); //same as above, after type adjustment
int fun(int a[10]); //same as above, after type adjustment
都是一样的!
你可以在这里找到我详细的答案:
- 对函数语法的引用-带和不带&
实际上不能有函数类型的形参。一个声明为"函数返回T"类型的函数参数被调整为"指向函数返回T的指针"类型,所以你的两个定义实际上是相同的。(C有相同的规则)
类似的规则也适用于数组参数声明。例如:
int main(int argc, char *argv[]);
真正的意思是:
int main(int argc, char **argv);
大多数编译器(例如MSVC, g++)接受第二种形式作为第一种形式的简写。从技术上讲,您应该始终使用第一种形式。
相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针