#define
-
C语言中的宏定义语句结尾不能写 “;”, 分号会被视为值的一部分,如:
#define NAME_LEN 16 -
定义宏函数时,如果有多行,则需要使用续行符,即反斜杠(\), 百度说:“因为宏定义必须在一行完成”,但是为了美观,要进行换行,就要使用续行符,如:
#define LIST_INSERT(item, list) do { \
item -> pre = NULL;
item -> next = list;
list = item;
} while (0); -
定义宏函数时,使用do{} while(0)语法,又是为何?
百度查资料发现,主要是因为,遇到 if else 语句 和 宏函数一起使用时,如:
#define ADD(x, y) { x+y }
if(condition)
ADD;
else …;
展开后:
if (condition)
{
x+y
};
else
…;
导致语法错误,使用do while 语句,正好可以解决此问题;
这样可以确保宏在使用时不会受制于单行或缺少分号的限制。
typedef
在 C 语言中,typedef 关键字用于为已有类型创建新的类型别名。它可以简化代码,使复杂的类型定义更清晰易读,特别是对于指针、结构体和函数指针等复杂类型。
基本语法
typedef 原始类型 新类型名;
- 原始类型:是已有的类型,例如 int、float、结构体类型、指针类型等。
- 新类型名:是对该类型的新名称,可以直接用它来声明变量。
使用场景和示例
- 基本类型的别名
typedef unsigned int uint;
// uint 就成为 unsigned int 的别名,之后可以直接使用 uint 代替 unsigned int
uint num = 10;
- 指针类型的别名
对于指针类型,typedef 可以让代码更简洁,尤其是函数指针等复杂类型。如:
typedef char* string;
// string 变成了 char* 的别名,可以更直接地定义字符串指针
string name = "Hello";
- 结构体类型的别名
在 C 语言中,定义结构体时必须使用 struct 关键字,但通过 typedef,可以为结构体创建一个简洁的别名。
typedef struct {
int x;
int y;
} Point;
// Point 成为结构体的别名,可以直接用 Point 定义变量,而不需要写 struct 关键字
Point p = {10, 20};
typedef 与 #define 的区别
typedef 与 #define 都可以定义新的名字,但 typedef 是在编译阶段处理的类型定义,而 #define 是在预处理阶段进行简单的文本替换。此外,typedef 更适合定义复杂类型,而 #define 更适合定义简单常量。