Linux及C语言高级[8](C语言的typedef和define)

767 阅读3分钟

“这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

【1】c语言中typedef的用法

typedef:类型重定义

📑eg1:

  • typedef int a; //原来a是变量,加上typedef此时a就变成了int类型

  • a b; //定义了b的变量,b变量的类型就是int

📑eg2:

typedef int *p; //原来的p只指针变量,而加上typedef之后 //变成了int *的类型。

p t,q; //定义了t和q的两个指针

📑eg3:

typedef char a[10]; //a代表的是char [10];

a w; //定义了有10个元素的成员都是char类型的数组

📑eg4:

typedef int (*fun)(int ,int); //fun是int(*)(int,int)的类型

fun ttt; //定义了ttt的函数指针

#include <stdio.h>

typedef int (*fun)(int ,int);
//fun ===>int (*)(int,int) 
//fun它是一个类型,它是新定义的类型,类似int

int add(int a,int b)
{
    return (a+b);
}

int  sub(int a,int b)
{
    return (a-b);
}

void show(int a,int b,int (*func)(int a,int b))
{
    printf("sum = %d\n",func(a,b));
}

//showw:它是一个函数
//函数的参数,int a,int b,fun func;
//fun:类型  func 这个类型的变量
//
//函数的返回值:fun===>int(*)(int,int)的类型

fun showw(int a,int b,fun func)
{
//func--->sub,调用func(a,b),就相当于
//在执行sub(a,b),并把它的结果通过
//printf打印出来。
    printf("sum = %d\n",func(a,b));		
    return func;
}

int main(int argc, const char *argv[])
{
fun ww;
//使用fun类型定义了ww的变量
		
//show(100,200,add);
//show(100,200,sub);
		
//ww接收showw函数的返回值
//ww--->func--->sub
ww = showw(100,200,sub);
		
//由于ww指向的是sub函数,所有ww(100,200),
//就相当于在执行sub(100,200),并把它的结果打印出来
printf("=== %d\n",ww(100,200));

return 0;
}

【2】c语言中define的用法

用法1:

#define M 5 //函数以后在使用M的时候,代表的使用的是5

用法2:

#inlcude <stdio.h> 
#define N 2     
#define M N+1
#define NUM (M+1)*M/2
int main()  
{
    pirntf("%d",NUM); //结果是8,宏只是简单的字符串替换
}              //如果想让define表达式的结果和预想的
                  //一样,需要在define后加括号                                      

用法3:

#define MAX(a,b) ((a)>(b)?(a):(b))

宏的函数是求a和b中的最大值 printf("Max = %d\n",MAX(100,200)); ===>结果是200

用法4:

#define PRINT_MSG(msg)  do{\
    printf("%s",msg);\
    return -1;\
}while(0) 

在宏中如果需要写多条语句,就可以使用do{}while(0) do{}while(0) 不会有返回值的。 int a = PRINT_MSG(msg); 错误

用法5:

#define MAX(a,b) ({ \
    int max; \
    if(a>b) \
    max=a; \
    else   \
    max=b;\
    max;\//===>注意这里不能用return
})

☞在宏中使用({}) ,里面可以写多条语句,宏的最后一句话的结果是宏的返回值。

#define ADD(a,b) ({ \
    a+b;        \          
})

📌宏是简单的字符串替换,牺牲了空间,换来了程序执行的效率

用法6:

宏中的一个#作用 #define S(n) #n ===>字符串化,将整数转化为字符串 printf("%s\n",S(5777));

用法7:

宏中两个##作用

#define NAME(a,b) a##b  ===>字符串拼接
char *hello = "hello world";
printf("%s\n",NAME(h,ello)); 
===>NAME(h,ello)===>拼接成hello
===>打印hello的时候就能看到
"helloworld"

【3】typedef和define的区别

  • typedef参与编译,而define是在预处理阶段完成的简单的字符串替换
  • typedef是类型的重定义,而define是字符串的替换
  • typedef后需要加;,而define后不需要加;
  • define前有#符号,而typedef前是没有# 常见的考法
typedef int* INTP;
		
INTP b,c; //定义了b和c的两个指针变量
		
#define INTP int *
INTP b,c; //定义了b的int类型指针,和c的int类型的变量
int *b,c;