【转】c语言的宏、预处理、typedef

转自:https://blog.csdn.net/qq_28992301/article/details/53308754  感谢原作者分享

强大的内置宏:

条件编译可以解决头文件重复包含的编译错误

 

 

条件编译的意义:

条件编译使得我们可以按照不同的条件编译不同的代码段,因而可以产生不同的目标代码

#if... #else #endif 被预编译器处理,而 if ... else ...语句被编译器处理,必然被编译进目标代码

实际工程中条件编译主要用于以下两种情况

不同的产品线公用一份代码

区分编译产品的调试版和发布版

小结:

 

展开
1.预处理的概念
由源码到可执行文件的过程:
源码.c->(预处理)->预处理过的.c->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序

gcc -E xx.c -o xx.i可以实现只预处理不编译,可以用来帮助我们研究预处理过程,帮助debug程序


2.条件编译
#if 和#ifdef的区别:#if后面跟的值只要是非零就为真,而#ifdef后面跟的宏被定义就为真
值得注意的是,条件编译要注意顺序,如果#define xxx 在#ifdef xxx 后面,那么这个#ifdef xxx 是为假、不成立的
3.宏定义
宏定义是没有先后顺序讲究的,这和条件编译不同,宏定义是递归替换的,直接会替换到没有宏定义为止,比如

#define M 10
#define N M     //纵使M定义在N之前,N的值仍然会被替换成10


宏定义的机制:宏定义视括号括起来的语句为整体,不会去理会里面的空格。宏定义对符号后面的第一个非空格字符敏感,该字符后面的所有内容,都将成为符号的实体

#define A(1 0)             1   *!&   0  //定义了一个宏,A(1 0)是符号,由于有括号,里面的实体不受影响
printf("A(1 0)");               //调用宏
printf("1   *!&   0");          //预处理之后的结果,实体本身内部的空格不受影响


带参宏的机制:带参宏的机制就是把符号和实体中,相同的字符作为元素。由于宏定义仅仅只是替换字符,所以在带参宏中大量使用括号来保证安全性

#define ADD(a, b) a+b       //不安全的带参宏
#define ADD_S(a, b) ((a)+(b))   //安全的带参宏,每个参数加括号,整体也加括号
3*ADD(1, 2);    //调用不安全的带参宏
3*1+2;      //预处理之后的结果,不加括号导致出错


带参宏、函数、内联函数的区别:带参宏没有开销,但是编译器不对参数进行类型检查;函数调用有开销,并且对参数进行类型检查;内联函数调用没有开销,同时也会对参数进行类型检查
使用宏来实现比较大小(用三目运算符)

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

使用宏来计算一年有多少秒

#define SEC_PER_YAER (365*24*60*60)     //错误,当一个数字直接出现在程序中时,它的默认类型是int,而一年有多少秒正好超出了int的范围
#define SEC_PER_YAER (365*24*60*60UL)   //正确,通过把任意一个数字强制类型转换为unsigned long,来使整个数字成为unsigned long类型
#define SEC_PER_YAER ((unsigned long)365*24*60*60)  //也行,但是逼格不够高


4.typedef
typedef与define的用法及差别。从下面式子我们可以总结出,typedef的用法就是加在普通的变量定义之前,该变量的名字就会成为该变量类型的代号,比如pchar 就会成为char *的代号;而define的用法也很有规律,就是#define 代号 实体

typedef char *pchar;
 #define pchar char * 


typedef常常与结构体一起用
 

typedef struct teacher  //定义了一个结构体类型teacher以及其代号teacher_t
{
    char name[20];
    int age;
    int mager;
}teacher_t;

teacher_t teacher_a;    //定义了一个teacher_t类型的变量teacher_a

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值