C语言深度剖析笔记(二)

struct

  • 空结构体:一般是一个字节,GCC中是 0 个字节

  • struct 和 class 的区别:struct的成员默认情况下属性是public,而 class成员是private。

union关键字

  • union中所有元素共用一个空间,同一时间只能存储其中一个数据成员,所有数据成员具有相同的起始地址。

存储模式

  • 大端模式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
  • 小端模式:字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

//系统大小端模式检测

#include <stdio.h>
int checkSystem()
{
    union 
    {
		unsigned int  a;
		unsigned char c;
	}t;

      t.a = 0x12345678;

   return (t.c == 0x78);
}

int main()
{
	if (checkSystem() == 1)
		printf ("小端\n");
	else
		printf ("大端\n");
	
    return 0;
}

enum与#define宏区别

  • #define宏常量是在预编译阶段进行简单替换;枚举常量则是在编译时确定其值。
  • 一般在调试器里,可以调试枚举变量,但不能调试宏变量。
  • 枚举可以一次定义大量相关常量,而#define宏一次只能定义一个。

typedef与#define的区别

#define是编译预处理指令,在编译预处理时换,不作正确性检查,不论是否正确只进行带入替换,只有在编译已被展开的源程序时才会发现可能的错误并报错。
2.typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。

两者的区别如例:

#define A int * tepedef int * A;(这是一条语句,要加分号)

两者的作用都是将A代表int *,但是#define在预处理时进行简单的替换,而typedef不是简单替换。

typedef定义的A相当于定义了一个指针指向了int *。而#define定义的A只是进行了替换

符号

注释符

  1. 注释符 :只要斜杠(/)和星号(*)之间没有空格,都会被当做注释的开始。
  2. 规则:1. 注释要简单易懂,防止有二义性。
    2. 代码与注释保持一致。
    3. 全局数据必须加注释。
    4. 注释位置不能放在被描述的代码下方。同一结构体不同域的注释要对齐
    5. 函数的出入口数据、条件语句、分支语句要有注释。
    6. 不需编译的区域要使用条件编译来实现。

接续符和转义符

  1. C语言中以反斜杠(\)表示断行。
  2. (\)做接续符时,反斜杠之后不能有空格,下一行之前也不能有空格。
  3. (\)还可以作为转义字符的开始标识。

单引号、双引号

  • 1 是整型常数,32位系统下占4字节
  • ‘1’是字符常量占1个字节
  • “1”是字符串常量,占2个字节

位运算符

  • 位运算符是不能用于基本类型是有符号的操作数上的。
  • 左移运算符<<:高位丢弃,低位补0
  • 右移运算符>>:正数时,高位补零;负数时最高位取决于编译系统。

预处理

  • _LINE_表示正在编译的文件的行号
  • _FILE_表示正在编译的文件的名字
  • _DATE_表示编译时刻的日期字符串
  • _TIME_表示编译时刻的时间字符串
  • _STDC_判断该文件是不是定义成标准C程序

宏定义

  • do-while-zero结构是在宏语句体中唯一可接受的具有完整语句的形式。

  • do-while-zero结构用于封装语句序列并确保其是正确的。

  • 宏语句体的末尾必须省略分号。

  • #undef 撤销宏定义

  • 宏不能在块中进行#define和#undef

文件包含

  • C语言#include命令实现文件包含的操作,是宏替换的延伸,有两种格式:#include ----#include “filename”

error预处理

  • 只要遇到# error指令就会生成一个编译错误提示信息,并停止编译。

line预处理

  • #line改变当前行数和文件名称。

pragma预处理

  • #pragma指令设定编译器的状态或指示编译器完成一些特定动作。
  1. #pragma message(“消息文本”)
    当编译器遇到此指令时,就在编译器输出窗口将消息文本打印出来。

  2. #pragma code_seg(“section-name”[,“section-class”])
    设置程序中函数代码存放的代码段。

  3. #pragma hdrstop
    预编译头文件到此为止

  4. #pragma resource “.dfm”表示把.dfm文件中的资源加入工程。

  5. #pragma pack(n) //编译器按照n字节对齐

  6. #pragma pack //编译器将取消自定义字节对齐方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值