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. 代码与注释保持一致。
3. 全局数据必须加注释。
4. 注释位置不能放在被描述的代码下方。同一结构体不同域的注释要对齐
5. 函数的出入口数据、条件语句、分支语句要有注释。
6. 不需编译的区域要使用条件编译来实现。
接续符和转义符
- C语言中以反斜杠(\)表示断行。
- (\)做接续符时,反斜杠之后不能有空格,下一行之前也不能有空格。
- (\)还可以作为转义字符的开始标识。
单引号、双引号
- 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指令设定编译器的状态或指示编译器完成一些特定动作。
-
#pragma message(“消息文本”)
当编译器遇到此指令时,就在编译器输出窗口将消息文本打印出来。 -
#pragma code_seg(“section-name”[,“section-class”])
设置程序中函数代码存放的代码段。 -
#pragma hdrstop
预编译头文件到此为止 -
#pragma resource “.dfm”表示把.dfm文件中的资源加入工程。
-
#pragma pack(n) //编译器按照n字节对齐
-
#pragma pack //编译器将取消自定义字节对齐方式