C语言 函数类型

1. 在 [不完全类型] 一文中,描述了C中的3大数据类型,即: 函数类型、对象类型和不完全类型, 这里再次引用这张图来进行“函数类型”的讲解。
C语言 函数类型_第1张图片
可以看到,函数类型是对立于其他的类型的,它不像“对象类型和不完全类型”,可以延伸(或是派生)出其他对象,或是包含一子系列。似乎从类型家族中脱离出来而独树一帜。函数类型也是一种派生类型,其中的“参数(类型)”是它的属性。然而 C 中是不存在“函数类型的变量”的, 因为函数类型不是对象类型,它没有特定的长度。同时无法用 sizeof 来获取某个函数的长度。

示例代码1 (Linux环境, gcc编译)

#include 
#include 
#include 
int addSumFunc(int a, int b)
{
    return a + b;
}

int main()
{
    printf("len: [%lu]\n", sizeof(addSumFunc));
    return 0;
}

gcc 环境下能够编译通过,而且还打印了结果: len: [1]。 若采用 g++ 编译,则报错:

test.cpp: 在函数‘int main()’中:
test.cpp:13:42: 错误: ISO C++ 不允许将‘sizeof’应用到函数类型的表达式上 [-fpermissive]

示例代码2 (Windows环境 Qt )

#include 
#include 
#include 
int addSumFunc(int a, int b)
{
    return a + b;
}

int main(int argc,char **argv)
{
    printf("len: [%d]\n", sizeof(addSumFunc));
    return 0;
}

在Qt环境下,是无法通过编译的。报错C++禁止对函数表达是使用sizeof

 error: ISO C++ forbids applying 'sizeof' to an expression of function type [-fpermissive]
 printf("len: [%d]\n", sizeof(addSumFunc));

因此, 不要尝试去获取某个函数的长度,因为函数的长度是未知的。同时也不存在从函数类型去派生出“函数的数组”这样的派生类型。

2. 不存在“函数类型的变量”,但存在“指向函数类型的指针”
(1)虽然存在“指向函数类型的指针”,但是我们不能对 指向函数类型的指针做指针运行,因为无法得知当前指针类型的大小

(2)函数类型也不能成为结构体struct 和共用体union 的成员
(3)“指向函数的指针类型”可以组合成指针或者作为结构体struct 、共用体union 的成员

int addSumFunc(int a, int b)
{
    return a + b;
}

typedef int (*ptr)(int, int);
typedef struct
{
    ptr p;  //指向函数类型(int (*)(int,int))的指针可以成为 struct 或 union 的成员
}Test;

因为“指向函数的指针类型”也是指针类型,而指针类型又是属于对象类型,如图:
C语言 函数类型_第2张图片
(4)函数类型不可以从 数组类型 派生
(5)数组不能作为函数返回值返回





























你可能感兴趣的:(C语言)