typedef int(init_fnc_t) (void)的理解
typedef int(init_fnc_t) (void);
这个就是一个取别名的过程。
我们通常情况下会如下使用 typedef :
typedef int MyInt;
MyInt a;
这个时候我们的MyInt 就和int是一样的意思。
而对于函数的申明我们通常会这样申明:
int InitFunction(void);
此时表示申明了一个函数名为InitFunction的函数, 函数没有任何的形参,返回值类型为int型。
而对于 typedef int(init_fnc_t) (void);
就是对一个 int (void)类型的函数类型进行取别名init_fnc_t。 我们可以利用这个别名进行创建这个类型的函数对象。
init_fnc_t *MyFunction;
这里就是一个函数的指针。如果某个函数的类型和这个函数一样的,那么可以将这个函数的指针指向该函数。然后你就可以直接调用MyFunction();
以下是例子
#include <stdio.h>
int GetData(void)
{
return 101;
}
int main()
{
typedef int (init_fnc_t)(void);
typedef int (*init_fnc_t_p)(void);
init_fnc_t *MyFunction; init_fnc_t_p MyFunctionP;
MyFunction = GetData; MyFunctionP = GetData;
printf("(init_fnc_t)(void) = %d \n",MyFunction());
printf("(*init_fnc_t_p)(void) = %d \n",MyFunctionP());
return 0;
}
C程序中除了简单类型名(int、char等),还有许多看起来复杂的类型名(结构体类型、共用体类型、指针类型等),C允许程序设计者用一个简单的名字代替复杂的名字。
1)命名一个新的类型名代表结构体类型
typedef struct {
int month;
int day;
}Date;
Date today; //定义变量
声明了新的类型名Date,然后可以用新的类型名Date去定义变量。
2)命名一个新的类型名代表数组类型
typedef int Num[100]; //声明Num为整形数组类型名
Num a; //定义a为整形数组名,它有100个元素
3)命名一个新的类型名代表指针类型
typedef char* String; //声明String为字符指针类型
String p; //定义p为字符指针变量
4)命名一个新的类型名代表指向函数的指针类型
typedef int (* Pointer)(); //声明Pointer为指向函数的指针类型,函数返回整型值
Pointer p; //p为Pointer类型的指针变量
归纳起来,声明一个新的类型名的方法是:
①先按定义变量的方法写出定义体(如int i;)。
②将变量名换成新类型名(例如:将i换成Count)。
③在最前面加typedef(例如:typedef int Count)。
④然后可以用新类型名去定义变量。
① 先按定义数组变量形式书写: int n[100] ;
② 将变量名n换成自己指定的类型名:
int NUM [100];
③ 在前面加上 typedef ,得到
typedef int NUM [100];
④ 用来定义变量: NUM n;
简单地说,就是 按定义变量的方式,把变量名换上新类型名,并且在最前面加“typedef”,就声明了新类型名代表原来的类型。
习惯上,常把用typedef声明的类型名的第一个字母用大写表示,以便于系统提供的标准类型标识符相区别。
include/initcall.h
typedef int (*init_fnc_t)(void);
common/board_f.c
static const init_fnc_t init_sequence_f[] = {
common/board_r.c
static init_fnc_t init_sequence_r[] = {
typedef int(init_fnc_t) (void)的理解的更多相关文章
- typedef int (init_fnc_t) (void)和typedef int (*init_fnc_t) (void)
1.typedef int (init_fnc_t) (void);表示定义init_fnc_t为函数类型,该函数返回int型,无参数.而“init_fnc_t *init_sequence[]= ...
- “typedef int (init_fnc_t) (void);“的含义
在读uboot的lib_arm/board.c中的start_armboot ()函数遇到了"init_fnc_t **init_fnc_ptr;”一句话,后来查看init_fnt_t数据类 ...
- int (*(*fp)(void *))[10]; 指向函数的指针类型
<pre lang="c" escaped="true">int (*(*fp)(void *))[10]; //这个类型用typedef分解出来 ...
- typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针
首先介绍大家比较熟悉的typedef int i;//定义一个整型变量i typedef myInt int: myInt j;//定义一个整型变量j 上面介绍得是我们常用的比较简单的typedef的 ...
- signal函数理解或者void (*signal(int signum,void(*handler)(int)))(int)理解
把void (*signal(int signum,void(*handler)(int)))(int)分成两部分: typedef void (*sighandler_t)(int); sighan ...
- 如何理解这段代码:void (*signal (int sinno,void(*func)(int)))(int)
void (*signal (int sinno,void(*func)(int)))(int) 先来看void(*func)(int) 这里的意思是声明一个函数指针func,它的参数类型为int ...
- void (*signal(int sig, void (*func) (int))) (int)理解
http://blog.csdn.net/sever2012/article/details/8281271 1.signal( int sig, void (*func)(int))signal是一 ...
- C语言复杂声明-void (*signal(int sig, void (*handler)(int)))(int);
问题提出 请分析此声明:void (*signal(int sig, void (*handler)(int)))(int); 求解过程 在对上面的例子作分析之前,我们需要了解C语言的声明优先级,&l ...
- signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析
转:http://blog.sina.com.cn/s/blog_4850a7880100hnam.html void (*signal(int signo, void (*fun(int))))(i ...
随机推荐
- FragmentFactory
import android.support.v4.app.Fragment; import java.util.HashMap; public class FragmentFactory { pri ...
- 代码实现:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
import java.util.ArrayList; import java.util.List; import java.util.Scanner; //有n个人围成一圈,顺序排号.从第一个人开始 ...
- Linux_RHEL_设置网络
目录 目录 Selinux Iptable NetworkManager 基本网络配置 编辑网卡子接口 ip指令 ifconfig指令 修改主机名 服务端口 Selinux 是Linux的一种权限管理 ...
- apache用户认证
创建一个目录abc:mkdir abc在此目录下建一个文件:12.txt正常情况下可以访问. 建立用户认证,从而使用户访问特定目录文件需要认证 在虚拟主机配置文件中即vim /usr/local/ap ...
- python unittest中setUp()和setUpClass()、tearDown()和tearDownClass()之间的区别
setUp():每个测试case运行之前运行tearDown():每个测试case运行完之后执行setUpClass():必须使用@classmethod 装饰器, 所有case运行之前只运行一次t ...
- PHP LDA off 解决
搭建完zabbix初始登录zabbix显示 PHP LDAP off 解决 不需要重新编译php 就可以增加 LDAP 模块 .首先进入自己的 PHP 安装目录中找到 ldap 文件夹 [root@b ...
- Flutter路由(一)
第一点:push使用 1.pushNamed——Navigator.of(context).pushNamed('routeName') Navigator.of(context).pushNamed ...
- Spring Boot 自定义注册 Servlet、Filter、Listener
前言 在 Spring Boot 中已经移除了 web.xml 文件,如果需要注册添加 Servlet.Filter.Listener 为 Spring Bean,在 Spring Boot 中有两种 ...
- Pytorch笔记 (3) 科学计算2
一.组织张量的元素 (1)重排张量元素 本节介绍在不改变 张量元素个数 和 各元素的值的情况下改变张量的大小 torch.Tensor类的成员方法 reshape() 参数是多个int类型的值. 如果 ...
- 转·带你用实例理解C语言回调函数
原文出处:https://segmentfault.com/a/1190000008293902?utm_source=tag-newest 前言: 如不懂函数指针,请先查阅关于函数指针内容的资料(h ...