C语言入门第二十篇,预处理和typedef

我们也该来说说预处理和typedef,为什么要把预处理和typedef放在一起呢,因为预处理中的宏定义有那么一点类似,这一篇我们来讲一下预处理和typedef。
预处理
预处理是在代码开始运行之前进行的动作,我们之前一直写#include<stdio.h>,其实他就是一种预处理。预处理大概分为以下几种
#define
define是c语言常用的宏,用法是将变量作为一个常量来使用,类似一种替换。如下面的代码:

#include<stdio.h>
#define N 5
int main(){
	int sum = N + 1;
	printf("%d\n", sum);
}

这里的N被替换为了5。这种用法在实际中其实很好用,对于有些重复很多次的常数可以通过字符进行替换,比如圆周率这些等等。
特别用法
来看下面这段代码:

#include<stdio.h>
#define MAX(a,b) ( (a) > (b) ? (a) : (b) )
int main(){
	int a=3,b=4;
	printf("%d\n", MAX(3,4));
}

define宏定义替换了后面比较大小的代码,完成了输出最大值的功能。
这里需要注意,我后面的代码打了很多括号,是因为define宏定义是单纯的替换对于运算的优先级这些都无法进行控制,所以尽量多打一些括号保证结果的正确性。
还有一个需要注意的问题,这种宏定义的方式尽量使用全部大写的方式,和函数的定义进行区分,不然很难分辨谁是宏谁是函数。
#undef
同#define的相反,移除一个宏定义,如果一个宏需要重新定义则需要移除
条件编译
在编译有些代码的时候,会因为有些原因不编译一些代码块。

#include<stdio.h>
#define DEBUG 1
int main(){
#if DEBUG
	printf("1");
#else
	printf("2");
#endif
}

这段代码给我们展示了条件编译使用方法,当判断为DEBUG为1的时候显示1,0的时候显示2。
条件编译中还可以加入#elif,和条件语句中else if原理相同。
同样#if还可以确认一个符号(这里指的是宏定义的符号)是否被定义。

#include<stdio.h>
#define DEBUG 0
int main(){
#if defined(DEBUG)
	printf("1");
#else
	printf("2");
#endif
}

和上上面的例子类似。
#if和#elif等和if语法类似,可以进行嵌套使用。
#include
文章开头就说了这是一个预处理,从开始讲到c语音到现在我们一直在用这个命令,他其实就是一种文件包含,可以包含函数库(一般使用尖括号<>)和本地文件(一般使用双引号“”)。
文件包含可以能会出现多重包含的情况,为了避免多重包含可以使用#ifndef来进行判定,例如我们先判定一下是非包含了a.h这个头文件代码如下

#ifndef _A_h
#include “a.h”
#endif

typedef
typedef看似和define相同实际差别很大,这也是我为什么把他们两个放在一起讲的原因,充分看出他们两个的区别。
typedef是一种别名设置,这里的别名指的不是变量的别名,而是标识符的别名,请看下面的代码。

#include<stdio.h>
typedef int a;

int main(){
	a n=1;
	printf("%d\n",n);
}

typedef将int的别名起为了a,我们可以看到a可以定义一个变量n,并且我们打印了出来。
高级用法
我们这里看看在数据结构中常常的用法。

#include<stdio.h>
typedef struct node
{
	int data;
	int *next;
}link;

int main(){
	link a;
	scanf("%d",&a.data);
	printf("%d\n",a.data);
}

这里的typedef将整个struct结构别名为了link,所以这里link a,a就是一个结构体。
我们再来看看一种特殊的用法。

#include<stdio.h>
typedef int a[10];
int main(){
	a b;
	scanf("%d",&b[2]);
	printf("%d\n",b[2]);
}

这段代码展现了typedef的另一种能力,这里的a定义的b到底是一个什么呢,是一个10个int元素的数组。可以通过上面的代码看出。
总结
本章介绍了预处理和typedef,其中一定要了解#define和typedef的区别。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值