欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言 typedef 和define

程序员文章站 2024-03-23 11:32:10
...

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

根据搜索到的相关知识和实践得出。如有错误,还望指正。

相关标签: #define typedef