您的位置:首页 > 其它

预处理

2015-12-03 21:46 218 查看
一、不使用sizeof,如何求内置类型占用的字节?

一般可用如下方式实现:

#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不用于定义模板参数;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: