typedef的用法,C语言typedef详解
C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。一旦用户在程序中定义了自己的数据类型名称,就可以在该程序中用自己的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。
例如,C 语言在 C99 之前并未提供布尔类型,但我们可以使用 typedef 关键字来定义一个简单的布尔类型,如下面的代码所示:
123typedef int BOOL;#define TRUE 1#define FALSE 0
定义好之后,就可以像使用基本类型数据一样使用它了,如下面的代码所示:
1BOOL bflag=TRUE;
C99标准中新增了布尔类型,且定义布尔变量的方式有两种,一种是使用 _BOOL,另一种是使用 <stdbool.h> 头文件中定义好的 bool 类型,感兴趣的小伙伴请猛击这里了解详情。
typedef的4种用法在实际使用中,typedef 的应用主要有如下4种。
1) 为基本数据类型定义新的类型名也就是说 ...
Android系统Launcher上手
关于LauncherLauncher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher。Launcher是安卓系统中的主要程序组件之一,安卓系统中如果没有Launcher就无法启动安卓桌面。那么你如果想要自定义一个安卓桌面,那么就需要修改调整这部分内容。
Launcher上手下面我就通过一个简单的UI(UI源码)界面来演示怎么自定义Launcher Activity—-自定义桌面。
新建项目Android Studio新建一个安卓项目。
选择Empty Activity,然后Next。
然后Finish完成项目创建。等初始化完成,项目结构如下:
修改Manifest在MainActivity的intent-filter标签内添加下边两行代码:
12<category android:name="android.intent.category.HOME" /><category android:name="android.intent.category.DEFAULT" />
修改activity_ma ...
查看Android系统源码版本号
我们手里有一份Android系统的源码,那你如果想知道这份源码是哪个版本的,该怎么办呢?
查找代码:
/build/core/version_defaults.mk
在文件中查找PLATFORM_VERSION,你就会发现如下段代码:
1234567ifeq "" "$(PLATFORM_VERSION)" # This is the canonical definition of the platform version, # which is the version that we reveal to the end user. # Update this value when the platform version changes (rather # than overriding it somewhere else). Can be an arbitrary string. PLATFORM_VERSION := 7.0endif
这里边的PLATFORM_VERSION := 7.0就是当前代码系统版本。
不同 ...
自己手写Android默认的Launcher
如果你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自己的Home,而且不希望用户安装的Launcher来替换掉你的Launcher。我们可以通过修改Framework来实现这样的功能。
这里以Android2.1的源代码为例来实际说明。
1、Android的启动过程。首先了解一下Android的启动过程。
Android系统的启动先从Zygote开始启动,然后……(中间的过程就不说了)…..一直到了SystemServer(framework)这个地方,看到这段代码:
12345678910111213141516171819202122232425262728293031323334 /** * This method is called from Zygote to initialize the system. This will cause the native * services (SurfaceFlinger, AudioFlinger, etc..) to be started. After ...
Java应用高CPU排查
1、命令top查看高CPU应用的PID(进程ID)。2、命令ps查询线程ID,awk处理数据,并将TID(线程ID)转换成16进制展示
1ps -mp pid -o THREAD,tid,time | awk '$2 > 30 {printf("%s \t %x\n",$0,$8)}'
命令中的30表示CPU使用率超过30%。3、命令jstack查询高CPU线程栈。
1jstask PID |grep -A 30 TID
PID是第一步查询到的高CPU进程ID。TID是第二步中高CPU线程ID,这里要用转换过的16进制字符串。-A 30 表示显示找到TID之后的30行。
(配图非事故现场图[呲牙])
Spring、SpringMVC和SpringBoot的区别
基本概念SpringSpring是一个开源的容器框架,它包含了web层,业务层和持久层的组件,其核心是控制反转(IOC)和面向切面编程(AOP),并且可以配置各种Bean,并维护Bean之间的关联关系。
SpringMVCSpringMVC是一种web层的MVC开源框架,用于替代servlet处理和响应请求,简化web层的开发。
SpringBootSpringBoot是一个微服务框架,是在Spring基础上做了一些扩展,简化了应用的开发和部署。
SpringBoot是为了简化Spring应用的创建、运行、调试和部署等而出现的,使用它可以做到专注于Spring应用的开发。
SpringBoot通过注解简化了Spring中的xml配置。
更具体的Spring原理和组成Spring框架封装了一系列的功能组件模块,包括SpringJDBC,SpringMVC,SpringTest,SpringSecurity,SpringAOP,SpringORM等等。大体如下图:
SpringMVC原理MVC主要包含模型(Model),视图(View)和控制器(Controller),像早期的Strut ...
Cannot create namespace MYDB.Test101 in multi-document transaction
org.springframework.dao.DataIntegrityViolationException: Cannot create namespace MYDB.Test101 in multi-document transaction.看错误信息,“不能在多文档事务时候创建集合Test101”。这个是错误使用MongoDB v4.0+,spring-data v2.1+并且使用事务时候才会遇到的。spring-data从2.1版本开始,对MongoDB 4.0附带的一项新功能,该功能支持多文档事务。该功能仅适用于现有集合。即,多文档事务不能包含将导致创建新集合的插入操作。您应该先创建自己的集合才能使用此功能。
utterances 评论系统使用
关于 utterancesutterances 是一款基于 GitHub issues 的评论工具。
官网地址
github地址
utterances应用程序地址
安装 utterances
首先要安装utterances,访问 utterances应用程序地址,然后点击install按钮安装。
安装过程中选择关联的存储库,默认是选择所有库,这里建议选择单个库。
Hugo 配置在config.toml文件中进行配置:
12345[params.utteranc] enable = true repo = "github-username/github-repository" ##换成自己得 issueTerm = "pathname" theme = "github-light"