C语言 typedef 和define
1、typedef
typedef 声明提供了一个方式去声明标识符的别名。用来替换一个复杂的类型名。
typedef int int_t, int_arr[20];
// 声明int_arr 是int[20] 的别名
// 声明 int_t 是int 的别名
typedef char char_t, *char_p, (*fp)(void);
// 声明 char_t 为char 的别名
// 声明 char_p 为 char* 的别名
// 声明 fp 为 char 类型的函数指针的别名。 可以使用 fp 来定义指向 int (*)(void) 的指针。
1 #include <stdio.h>
2
3 typedef int int_t, int_arr[20];
4 typedef char char_t, *char_p, (*fp)(void);
5 char getChar(void);
6
7 int main()
8 {
fp fp1;
fp1 = getChar; // fp1 为 指向getChar() 的指针 , 注意fp 为改数据类型。不是对象。 所以 fp = getChar 是错误的。fp 定义的对象才可以赋值为指向函数的指针。
9 int_t type_int = 10;
10 int_arr array_int; // 定义array_int 为20的整型数组
11 printf("size of arary_int %ld\n", sizeof(array_int) / sizeof(int));
// sizeof 的类型定义为size_t sizeof 的返回值与编译器有关
12 char_t t_c = 'T'; //定义 c 字符为char 类型
13 char_p p_c = &c; // 定义 p_c 为char 类型指针
14 char_t *p_c1 = &c; // p_c 与p_c1 类型一致。
15 printf("integer %d\n", type_int);
16 printf("char %c address is %p, point %p to char %c\n", t_c, &t_c, p_c, *p_c);
17
18 return 0;
19 }
20 char getChar(void)
21 {
22 return 'U';
23 }
char_t 代表char 类型 所以 char_t t_c 相当于 char t_c
char_p 代表char * 类型 , 所以char_p p_c 相当于char *p_c
int_arr array // 相当于定义数组int array[20]
int_arr array[20]; // 相当于定义数组 int array [20] [20]
结构体类型定义
typedef strcut node node1;
typedef struct node {
int a;
int b;
}node1;
struct node lnode1; // struct node 对象 lnode1
node1 lnode2; // strcut node 对象 lnode2
可以使用 node1 代替 struct node 定义结构体对象。
node1 lnode 定义lnode 实例
struct node lnode 与 node1 是一致的。
可以省略 node
typedef struct {
int a;
int b;
}node1; // 使用 node1 定义对象
引用的数据来自于C preference 文档。
https://en.cppreference.com/w/c/language/typedef
2、#define
在#define 在预编译 时使用。 称之为 宏定义。
#define 标识符 常量 // 在预编译时使用标识符替换常量。
如果需要解除宏定义的常量使用 则使用 #undef 标识符 。 在此之后则无法使用此标识符
#define identifier replacement-list(optional) (1)
#define identifier( parameters ) replacement-list(optional) (2)
#define identifier( parameters, ... ) replacement-list(optional) (3) (since C++11)
#define identifier( ... ) replacement-list(optional) (4) (since C++11)
#undef identifier (5)
在#define 中有 特殊含义的字符
符号 /
用于 宏定义的换行,防止一行无法容纳下宏定义 在 \ 之后不可以有多余的空格。在\之后为换行符
如 #define TU(x) 2 * x \
- 1
等价于 #define TU(x) 2 *x -1
符号 #
#define TU(x) #x 将x转为字符串 printf("string " TU(x) “\n”) ; 字符串连接。
符号 ##
#define TU(x, y) x##y 使x和y 连接为一个标识符 。不可以作为字符串输出。但是如果为数字可以将数字连接。连接后的实际参数名,必须为实际存在的参数名或是编译器已知的宏定义。
参考文档
https://en.cppreference.com/w/cpp/preprocessor/replace
根据搜索到的相关知识和实践得出。如有错误,还望指正。
上一篇: js 自定义extend函数