什么是功能类型

时间:2014-07-08 15:13:54

标签: c

在C11规范中引用了术语函数类型如下:

  

函数类型描述具有指定返回类型的函数。一个   函数类型的特点是它的返回类型和   参数的数量和类型

但我不明白函数类型是仅由其返回类型还是由其参数描述。

例如,如果我有以下功能:

double bar(int a, int b)
{
   /* ... */
}

哪个类型?

4 个答案:

答案 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方法,它几乎可以识别数组以及它们在内存中的位置的函数;只是我们在这里有数据(数组)和代码(函数)。

通过省略声明中的标识符,可以像任何其他类型(例如intint*)一样获取函数的类型。这为您提供了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;
}