C++基础(二)
------------恢复内容开始------------
一、register关键字
这个关键字的作用是请求编译器尽可能的将变量存储在CPU内部寄存器中,而不是通过内存寻址访问,如果定义了很多register变量,可能会超过CPU的寄存器个数,所以只是可能。
注意:register变量必须是能被CPU接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于等于整型的长度。
二、#define命令
#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串。该命令有两种格式,一种是不带参数的宏定义,另一种是带参数的宏定义。
1、不带参数的宏定义
#define <宏名/标识符> <字符串>
(1)宏定义的末尾不加分号
(2)可以用#undef命令终止宏定义的作用域
(3)宏定义可以嵌套
(4)宏定义在编译前进行,不分配内存。变量定义分配内存,函数调用在编译后程序运行时进行,并分配内存。
2、带参数的宏定义(除了字符串替换外还要做参数代换)
#define <宏名>(<参数表>) <字符串>
eg:#define S(a,b) a*b
一个标识符被宏定义后,该标识符便是一个宏名。这是,在程序中出现的是宏名,在该程序被编译前,先将宏名用被定义的字符串替换,这成为宏替换,替换后才进行编译。
宏展开不占用运行时间,只占用编译时间,函数调用占运行时间。
宏定义前面的那个必需是合法的用户标识符(可以是关键字,但是不可以是0x)
#define N 2+2
int a =N * N;
printf("%d",a);
宏运算是在预处理阶段完成的,该阶段替换文本只是看作一个字符串,不会发生任何计算,在展开时只是在宏N出现的地方简单的使用串2+2替换N,所以该程序展开的结果是a=2+2*2+2=8;
3、宏冷门知识
x##y表示x连接y #define Conn(x,y) x##y
#@x表示给x加单引号 #define ToChar(x) #@x
#x是给x加双引号 #define ToString(x) #x
4、使用带参数的宏的优点
可以完成函数调用的功能,又能减少系统开销,提高运行效率,使程序更加模块化便于组织而且可以重复利用。
三、typefef
作用是给现有的类取一个别名。
四、union联合体
union的所有字段都有同样的偏移量,而且所有的字段都是相互重叠的,更改一个字段的值其他字段也会发生变化。
1、判断机器大小端
大端模式:数据的低位(右)保存在内存的高地址(右),数据的高位(左)保存在内存的低地址(左)。
小端模式:数据的低位(右)保存在内存的低地址(左),数据的高位(左)保存在内存的高地址(右)。
2、创建别名以进行强制类型转换。
typedef union {
ThirdTest * thirdTest;
OurTestThird *ourTestThird;
} TestThird;
TestThird testThird;
testThird.thirdTest = getCallOneFunction(); //这个一个库函数,返回的类型是ThirdTest *
CallOurSomeOneFunction(testThird. ourTestThird); //这个是自己的函数,参数类型是OurTestThird *
此时Union就起到了一个将类型ThirdTest *强制转换为OurTestThird *的作用。
------------恢复内容结束------------

浙公网安备 33010602011771号