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 *的作用。

------------恢复内容结束------------

posted @ 2022-03-02 09:23  czy1223  阅读(87)  评论(0)    收藏  举报