Android源码中中一种常见的struct使用方法
直接看例子:
#include<iostream>
#include<stdlib.h>
using namespace std; struct Base{
int ba;
int bb;
void printB(){
cout<<"base print"<<endl;
}
}; struct A{
struct Base b;
int aa;
void printA(){
cout<<"A print"<<endl;
}
}; int main(){
//A类型的指针
struct A *a; //按A类型创建对象
a = (struct A *)calloc(, sizeof(*a));
a->b.ba = ;
a->b.bb = ;
a->aa = ; //将其传换为Base类型变量
struct Base *bp = &(a->b);
bp->printB();
cout<<bp->ba<<" "<<bp->bb<<endl; //上面的都很常见,但注意这里:将其直接转换回A类型
struct A *ap = (struct A *)bp;
ap->printA();
cout<<ap->b.ba<<" "<<ap->b.bb<<" "<<ap->aa<<endl;
}
输出:
base print
12 34
A print
12 34 65
要注意的是Base类型变量必须是A的第一个成员变量!
这种用法在Android源码的HAL中经常用到,上面的Base可以作为一个函数接口的规范参数,但是传入的却是另一种类型,在函数中按Base类型处理,后面又可以将其强制转换成原本的类型A处理。这也你就可以扩展Base类型了,感觉与继承的效果有些类似。
Android源码中中一种常见的struct使用方法的更多相关文章
- android 源码编译中的错误 解决
1.编译种错误提示: arm-none-linux-gnueabi-gcc: directory: No such file or directory arm-none-linux-gnueabi-g ...
- Ubuntu编译Android源码过程中的空间不足解决方法
Android源码一般几十G,就拿Android5.0来说,下载下来大概也有44G左右,和编译产生的文件以及Ubuntu系统占用的空间加起来,源码双倍的空间都不够有.编译源码前能分配足够的空间再好不过 ...
- [原]编译Android源码过程中遇到的问题
编译Android源码的过程参考Android官网介绍: 1.下载Android源码的步骤:https://source.android.com/source/downloading.html 2.编 ...
- jdk/java版本与Android源码编译中的错误
错误一:javap未指向有效的java版本 Traceback (most recent call last): File "../../base/android/jni_generator ...
- Eclipse与Android源码中ProGuard工具的使用
由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...
- Eclipse与Android源码中ProGuard工具的使用(代码混淆)
由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...
- 编译android源码m、mm、mmm命令的使用
http://blog.163.com/zz_forward/blog/static/212898222201442873435471/ gcc怎么查看它的默认include路径和库的路径呢? //- ...
- 访何红辉:谈谈Android源码中的设计模式
最近Android 6.0版本的源代码开放下载,刚好分析Android源码的技术书籍<Android源码设计模式解析与实战>上市,我们邀请到它的作者何红辉,来谈谈Android源码中的设计 ...
- Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令
Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...
随机推荐
- e823. 创建JSplitPane
A split pane divides its space between two components. The split pane contains a divider that allows ...
- (转)DSound开发常用的几个结构
WAVEFORMATEX WAVEFORMATEX { WORD wFormatTag; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesPe ...
- Winform控件学习笔记【第六天】——TreeView
TreeView控件用来显示信息的分级视图,如同Windows里的资源管理器的目录.TreeView控件中的各项信息都有一个与之相关的Node对象.TreeView显示Node对象的分层目录结构,每个 ...
- Ubuntu 安装IntelliJ IDEA
1. 下载IDEA 官网地中:http://www.jetbrains.com/idea/download/index.html 选择对应操作系统的版本.下载后,我的文件名称为: idea ...
- php + crontab 执行定时任务
1.yii2中的console <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yi ...
- Java基础--深克隆补充
深克隆文章很多,这里推荐Java提高篇--对象克隆(复制). 以上文章条理清晰,一目了然,但最近在项目中碰到的实际问题是,所要克隆的对象是加上子类父类共计207个,无论用上述两种方式的哪一种,都要一一 ...
- Fedora更改密码
开机进入单用户模式 按e --->进入编辑界面之后,在“rhgb quiet”字符前面,输入“single”加空格,回车-->返回上一步中启动命令行菜单. 按 b ---> pas ...
- sql 查找最后一条记录
1.通过row select * from tablewhere rownum<(select count(*)+1 from table)minusselect * from tablewhe ...
- 腾讯大渝网(esf.cq.qq.com)任意手机注册+短信验证码泄露
地址在这里:http://esf.cq.qq.com/c=register 直接返回短信验证码, data: {data:您的手机验证码为8453,2小时内有效., auth_code:8453}ti ...
- CocoaPods 第三方库管理器
下载地址:https://github.com/kattrali/cocoapods-xcode-plugin 跟 VVDocumenter 规范注释生成器的安装方式一样: 下载开源工程在 Xcode ...