直接看例子:

#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使用方法的更多相关文章

  1. android 源码编译中的错误 解决

    1.编译种错误提示: arm-none-linux-gnueabi-gcc: directory: No such file or directory arm-none-linux-gnueabi-g ...

  2. Ubuntu编译Android源码过程中的空间不足解决方法

    Android源码一般几十G,就拿Android5.0来说,下载下来大概也有44G左右,和编译产生的文件以及Ubuntu系统占用的空间加起来,源码双倍的空间都不够有.编译源码前能分配足够的空间再好不过 ...

  3. [原]编译Android源码过程中遇到的问题

    编译Android源码的过程参考Android官网介绍: 1.下载Android源码的步骤:https://source.android.com/source/downloading.html 2.编 ...

  4. jdk/java版本与Android源码编译中的错误

    错误一:javap未指向有效的java版本 Traceback (most recent call last): File "../../base/android/jni_generator ...

  5. Eclipse与Android源码中ProGuard工具的使用

    由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...

  6. Eclipse与Android源码中ProGuard工具的使用(代码混淆)

    由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...

  7. 编译android源码m、mm、mmm命令的使用

    http://blog.163.com/zz_forward/blog/static/212898222201442873435471/ gcc怎么查看它的默认include路径和库的路径呢? //- ...

  8. 访何红辉:谈谈Android源码中的设计模式

    最近Android 6.0版本的源代码开放下载,刚好分析Android源码的技术书籍<Android源码设计模式解析与实战>上市,我们邀请到它的作者何红辉,来谈谈Android源码中的设计 ...

  9. Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令

    Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...

随机推荐

  1. e861. 在两个组件之间共享输入映射和事件映射

    By sharing an InputMap or ActionMap, any change to the shared InputMap or ActionMap will affect all ...

  2. Response.Redirect与Server.Transfer区别-转

    执行过程: 1.浏览器ASP文件请求->服务器执行->遇到response.redirect语句->服务器发送response.redirect后面的地址给客户机端的浏览器-> ...

  3. 我的openwrt开发相关文章

    openwrt学习笔记: 在openwrt的学习过程中,走了非常多的弯路.一直以来有个期盼.希望能够出个简易教程,希望openwrt的同仁们能够更加高速的入手. . openwrt学习笔记(三十二): ...

  4. SpringBoot和SpringCloud配置

    1.基本配置 #项目名称(访问路径) server.context-path=/manager #端口 server.port=8764 #session过期时间 server.sessionTime ...

  5. JSON数组,JSON对象,数组的区别与基本操作整理

    JSON 语法规则 JSON 语法是 javascript 对象表示语法的子集. 数据在名称/值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON 名称/值对 JSON 数据的书写格式是: ...

  6. Ubuntu一般软件安装后的路径

    Ubuntu一般安装的软件查找路径: computer/usr/local/

  7. Nginx初入

    商城项目做了一个多月了,想到必须用到负载均衡,首先分享第一个demo,五月份上线后,会继续分享一系列相关知识. 在nginx根目录下,用了一个园友的批处理文件nginx.bat,用于启动和关闭ngin ...

  8. VC设置cookies实现文件刷下载量

    VC设置cookies实现文件刷下载量 VC设置cookies实现文件刷下载量 分类: c/c++2013-10-11 17:22 250人阅读 评论(0) 收藏 举报   目录(?)[+]   同学 ...

  9. Node.js之操作Mongodb

    // mongoose 链接 var mongoose = require('mongoose'); var db = mongoose.createConnection('mongodb://127 ...

  10. level 1 -- unit 2 - what 引导的特殊疑问句

    特殊疑问句 what 引导的特殊疑问句 常见结构如下: 1. what be sb/sth? 1.1 如 谓语动词是单数is what is your phone number ? what is y ...