在C11规范中引用了术语函数类型如下:
函数类型描述具有指定返回类型的函数。一个 函数类型的特点是它的返回类型和 参数的数量和类型
但我不明白函数类型是仅由其返回类型还是由其参数描述。
例如,如果我有以下功能:
double bar(int a, int b)
{
/* ... */
}
哪个类型?
答案 0 :(得分:6)
它在你引用的文字中,"及其参数的数量和类型",所以参数很重要。
示例函数的类型是double (int, int)
,我不确定符号,但是类似的东西。
即。 "一个函数,它接受两个int
个参数并返回一个double
"。
答案 1 :(得分:3)
函数类型描述具有指定返回类型的函数。一个 函数类型的特点是返回类型和数字和 其参数的 类型
因此,参数类型是函数类型的一部分。 double bar(int a, int b)
与double foo(int c, int d)
的类型相同,但与double foo(int a, double b)
的类型不同。
您可以将栏指定给函数指针,如:
double (*func)(int, int) = bar;
答案 2 :(得分:1)
函数类型的特征在于其返回类型以及参数数量和参数类型。将函数声明为
时double bar(int a, int b);
这意味着bar
是 type 的函数,它接受两个int
类型的参数并返回double
值。您还可以将函数类型理解为
double (*fptr)(int, int);
fptr
是一个指针,它可以保存函数类型的地址,它采用int
类型的两个参数并返回double
。
当标准表示函数类型不能返回函数类型或数组类型时,表示
功能无法返回功能
int f(int ) (int ); //Wrong
函数无法返回数组:
int f(int ) []; //Wrong
但是,可以从函数返回指向函数/数组的指针。
答案 3 :(得分:0)
底线是,函数是任何其他函数的正常标识符;它就是它所代表的东西,即一个与普通物体不同的功能。 C / C ++中的函数不是对象;他们不能通过或改变。但函数指针可以。在某种程度上,函数和它们的指针类似于数组。另一个并行的是实用的C方法,它几乎可以识别数组以及它们在内存中的位置的函数;只是我们在这里有数据(数组)和代码(函数)。
通过省略声明中的标识符,可以像任何其他类型(例如int
或int*
)一样获取函数的类型。这为您提供了double (int, int)
正确提到的其他人。表示类型的每个序列只有一个位置,其中可以合法地插入标识符(此处在双精度之后)。
但回到底线:函数名称只是一个带有类型的标识符。假设我们在一个文件中有一个函数定义,并希望在另一个文件中使用它,这是常见的:
文件1:正常功能定义
double external_function(int a, int b)
{
return a+b;
}
文件2:声明该功能的标识符并使用它。然后做一些虚假的事情。
#include <iostream>
using namespace std;
// Declare a function type alias (not a pointer type!)
typedef double function_type(int, int);
// Use that to declare that identifier. Not different from
// any other identifier.
extern function_type external_function;
// Also totally equivalent to the conventional notation;
// it's not harmful to declare the same global identifier
// multiple times.
extern double external_function(int, int);
// Define a function with a different signature, i.e.
// a different type. We'll use it in a joke in main().
double f_float_float(float f1, float f2)
{
return f1 + f2;
}
int main()
{
// Call the previously declared external function: -> 3.
cout << external_function(1,2) << endl;
// Do something funny: Declare a pointer to such a function ...
function_type *function_pointer;
// ... and assign a function with the wrong type to it.
// function_pointer = f_float_float; /* doesn't compile: need cast */
function_pointer = reinterpret_cast<double (*)(int, int)>(f_float_float);
// Now call it with certain values
// (cf. http://www.cprogramming.com/tutorial/floating_point/understanding_floating_point_representation.html)
// and see what happens.
cout << function_pointer(0x3f800000, 0x40400000) << endl;
return 0;
}