预处理
2015-12-03 21:46
218 查看
一、不使用sizeof,如何求内置类型占用的字节?
一般可用如下方式实现:
该宏定义中,(char*)&Value返回Value地址的第一个字节,(char*)(&Value+1)返回Value地址的下一个地址的第一个字节,所以他们的差为所占的字节数。
二、如何使用宏求结构体的内存偏移地址?
在C语言中,ANSI C标准允许值为0的常量被强制转换成任何一种类型的指针,而且转换结果是一个空指针,即NULL。(type*)0就是一个类型为type的NULL指针,&((type*)0->field)是计算结构体中field字段的地址。同时因为地址为0,所以这个地址的值就是字段相对于结构体基址的偏移。size_t一般用来表示一种计数,比如有多少东西被拷贝等。例如:sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建立的最大对象的字节大小,在32位系统中size_t是4字节的,在64位系统中,size_t是8字节的,这样利用该类型可以增加程序移植性。
使用宏求结构体的内存偏移地址,避免了一个实例化type对象,而且求值在编译期进行,没有运行期负担,程序效率大大提高。
三、如何用sizeof判断数组中有多少元素?
四、typedef和define有什么区别?
typedef和define都是替一个对象取一个别名,以此来增强程序的可读性,它们在使用和作用上存在以下几方面的不同:
define是预处理指令,在预处理时进行简单的字符串替换,不做正确性检查;typedef是关键字,它在编译时处理,有类型检查的功能,它在自己的作用域内给一个已经存在的类型一个别名,typedef定义数组、指针、结构等类型将带来很大的方便,使程序书写简单且意义更加明确,增强了可读性。
typedef用来定义类型的别名,不仅包括内部类型,还包括自定义类型;define不仅可以为类型取别名,还可以定义常量、变量、编译开关等。
#define没有作用域的限制,而typedef有自己的作用域,不过一般不再函数内使用typedef.
五、C++中struct与class的区别是什么?
class的数据成员在内存中的布局不一定是数据成员的声明顺序,struct则是按声明顺序存储结构体成员的;
在做类型定义时,首先默认继承权限class是private继承,而struct默认public继承;其次class还用于定义模板参数,像typename,struct不用于定义模板参数;
一般可用如下方式实现:
#define MySizeof(Value) (char*)(&Value+1)-(char*)&Value
该宏定义中,(char*)&Value返回Value地址的第一个字节,(char*)(&Value+1)返回Value地址的下一个地址的第一个字节,所以他们的差为所占的字节数。
二、如何使用宏求结构体的内存偏移地址?
#define OffSet(type,field) ((size_t)&((type*)0->field))
在C语言中,ANSI C标准允许值为0的常量被强制转换成任何一种类型的指针,而且转换结果是一个空指针,即NULL。(type*)0就是一个类型为type的NULL指针,&((type*)0->field)是计算结构体中field字段的地址。同时因为地址为0,所以这个地址的值就是字段相对于结构体基址的偏移。size_t一般用来表示一种计数,比如有多少东西被拷贝等。例如:sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建立的最大对象的字节大小,在32位系统中size_t是4字节的,在64位系统中,size_t是8字节的,这样利用该类型可以增加程序移植性。
使用宏求结构体的内存偏移地址,避免了一个实例化type对象,而且求值在编译期进行,没有运行期负担,程序效率大大提高。
三、如何用sizeof判断数组中有多少元素?
#define Count (sizeof(array)/sizeof(array[0])) #define Count (sizeof(array)/sizeof(数组的类型,如int double等))
四、typedef和define有什么区别?
typedef和define都是替一个对象取一个别名,以此来增强程序的可读性,它们在使用和作用上存在以下几方面的不同:
define是预处理指令,在预处理时进行简单的字符串替换,不做正确性检查;typedef是关键字,它在编译时处理,有类型检查的功能,它在自己的作用域内给一个已经存在的类型一个别名,typedef定义数组、指针、结构等类型将带来很大的方便,使程序书写简单且意义更加明确,增强了可读性。
typedef用来定义类型的别名,不仅包括内部类型,还包括自定义类型;define不仅可以为类型取别名,还可以定义常量、变量、编译开关等。
#define没有作用域的限制,而typedef有自己的作用域,不过一般不再函数内使用typedef.
#define intptr1 int* typedef int* intptr2; intptr1 p1,p2; intptr2 p3,p4;
intptr1 p1,p2替换为int* p1,p2,而intptr2 p3,p4相当于int* p3,*p4,宏替换是不含任何意义的替换,而typedef为一种数据类型起的别名是带有一定含义的
五、C++中struct与class的区别是什么?
class的数据成员在内存中的布局不一定是数据成员的声明顺序,struct则是按声明顺序存储结构体成员的;
在做类型定义时,首先默认继承权限class是private继承,而struct默认public继承;其次class还用于定义模板参数,像typename,struct不用于定义模板参数;
相关文章推荐
- UISegmentedControl
- dedecms织梦特定条件下,隐藏特定栏目的方法,通过css实现
- codeforces604C Alternative Thinking (脑洞大开 )
- 浅谈面向对象(java)
- EM 算法在GMM中的应用
- 日记
- Android集成支付宝
- qmake编译选项的控制(debug|release)
- 一些漂亮的js库
- Android之mvp和mvc对比分析以及实际应用
- 练习E-5
- Android第三方开源FloatingActionButton(com.getbase.floatingactionbutton)【1】
- 图的搜索
- 京东咚咚架构演进
- 图的搜索
- 【Objective-C学习记录】第二天
- 默认实参,constexpr函数
- iOS开发见闻-第9期
- Day2:12/03/2015继承(Derived)
- UIALertView的基本用法与UIAlertViewDelegate对对话框的事件处理方法