typedef int (*funp_t)(int) 和typedef int fun_t(int)的比较

相似点

  • 都使用typedef将由基础数据类型构成的复杂组合类型赋给一个简单的名字;
  • 都遵循C的传统——由typedef定义的类型以“_t“结尾;
  • 二者都能起到减少代码字符输入量的作用;
  • “一定程度上”增加代码的可读性(此观点不具有绝对正确性,仁者见仁)
  • 在以下情况调用函数使用方式相同:
void second(fun_t first);
void second(fun_t *first);
void second(funp_t first);

针对这三种方式,在second函数内,既可以用first(14)调用也可以用(*first)(14)调用。

区别

  • typedef int (*funp_t)(int)定义一个函数指针类型 funp_t; 而typedef int (fun_t)(int)定义一个函数类型 fun_t;
funp_t p; //定义一个类型是int (*)(int) 的变量p,即:函数指针p
fun_t p; //声明一个整型参数和一个整型返回值的函数p,即:int p(int);
fun_t *p; //定义一个指向函数int ()(int)的指针变量p和funp_t p;等价
  • funp_t直接可用于函数参数和返回值;而fun_t可以直接用于函数参数,但是不能直接用于函数返回值,此时要结合*才可以用作返回值;
funp_t setfun(funp_t nf); //right 设置一个新的函数指针nf,返回旧的函数指针
fun_t getfun();//error,函数不能返回函数
fun_t * getfun(); //right
void setfun(fun_t nf); //right 等价于 funp_t nf
void setfun(fun_t *nf); //right 等价于 funp_t nf

C99中“明确“指出函数不能返回函数(ISO/IEC 9899:1999 P141的第137号脚标注);函数内部不能定义函数;以及函数能够转换成对应的函数指针(ISO/IEC 9899:1999 P143 EXAMPLE2),反之不行!

  • funp_t用的较多,而fun_t用的较少!

对于fun_t作用除了结合’*’声明或定义变量外。它还有一个偶尔有用的用途:函数内部(外部)声明函数!

虽然C99指出没有static限制的函数都具有隐式的extern属性,但是某些编译器做不到:依旧是先声明(定义)再使用;因此如果某个函数在未声明或定义之前调用了,那么你必须在调用之前显式的声明!

比如下面代码片

void second(void)//first定义在后,且无前置声明
{
    first(14);//某些编译器会编译不过或给出警告
}

int first(int n)
{
    printf("%d\n", n);
    return 7;
}

(1)可以在调用之前声明来解决

fun_t first;//函数声明
void second(void)
{
    fun_t first; //函数声明
    first(14);
}
//...

可以同时声明多次,但是定义只能一次。上面代码中声明两次,只是为了示例,用户自选一种即可。这里主要为了体现函数内部也可以函数声明的方式!

(2)以传递参数形式解决

void second(fun_t first)
{
    first(14);
    (*first)(14); //right
}
//...
时间: 2024-10-27 19:22:08

typedef int (*funp_t)(int) 和typedef int fun_t(int)的比较的相关文章

C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()的区别

1.int适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型); 2.int.Parse(string sParameter)是个构造函数,参数类型只支持string类型; 3.Convert.ToInt32()适合将Object类型转换为int型; 4.Convert.ToInt32()和int.Parse()的细微差别: 对于空值(null)的处理不 同,Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则 会产生异常

error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

1 #include<iostream> 2 using namespace std; 3 4 5 extern int i; 6 extern float f(float a); 7 float b; 8 float f(float a){ 9 return a+1.0; 10 } 11 int i; 12 int h(int x) 13 { 14 return x*i; 15 } 16 17 main() 18 { 19 b=1.0; 20 i=2; 21 f(b); 22 h(i); 2

/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Soluti

/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<in

Int.Parse()、Convert.toInt32()和(int)区别

通过网上的查询从而了解了Int.Parse().Convert.toInt32()和(int)区别. 一.定义上的差别 int类型表示一种整型,.NET Framework 类型为 System.Int32.而是用(int)表示显式强制类型转换,当从 int 类型到 long.float.double 或decimal 类型,称为隐式转换:当从从double 或decimal.float.long.int类型逐级转换时,称为显式强制类型转换.(对long 类型或是浮点型到int 类型的显式强制转

Python3基础 int(input())输入数字并产生一个int类型变量

镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 1 code 1 aNumber=int(input("请输入一个整数:")) 2 print(aNumber) 2 show ------------------------------------------博文的精髓,在技术部分,更在镇场一诗.Python是优秀的语言,值得努力学习

c# List&lt;int&gt; 转 string 以及 string [] 转 List&lt;int&gt;

List<int> 转 string : list<int>: 1,2,3,4,5,6,7  转换成字符串:“1,2,3,4,5,6,7” List<int> list= new List<int>() { 1, 2, 3, 4, 5, 6, 7 }; string depaid = string.Join(",", list); string 转 List<int>: string s = "1, 2, 3&quo

int([x[, base]]) : 将一个字符转换为int类型,base表示进制

>>> int(-12) -12 >>> int(-12.00) -12 >>> int(90) 90 >>> int(90, 2)

C# 中 int、Convert.ToInt32()、int.Parse()的区别

int适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型); int.Parse(string sParameter)是个构造函数,参数类型只支持string类型; Convert.ToInt32()适合将Object类型转换为int型; Convert.ToInt32()和int.Parse()的细微差别: 对于空值(null)的处理不 同,Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则 会产生异常. https:

WinPcap应用程序:error: C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

在对WinPcap的文档进行学习时,直接复制了别人的代码,然后就是报错. 头疼不已,然后才发现C++的版本不一样,main函数前面必须加上数据类型,因此改为:int main(),一起就Ok了!! 原文地址:https://www.cnblogs.com/almn/p/11286978.html