C语言宏定义、预处理、文件包含

一、C语言预处理
1、由源码到可执行程序的过程如下:

  • 源码.c->(编译)->elf可执行程序
  • 源码.c->(编译)->目标文件.o->(链接)->elf可执行程序
  • 源码.c->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序
  • 源码.c->(预处理)->预处理过的.i源文件->(编译)->汇编文件.S->(汇编)->目标文
    件.o->(链接)->elf可执行程序
  • 预处理用预处理器,编译用编译器,汇编用汇编器,链接用链接器,这几个工具再加上其他一些额外的会用到的可用工具,合起来叫编译工具链。gcc就是一个编译工具链。

2、#include <>和#include ""的区别

  • <>专门用来包含系统提供的头文件(就是系统自带的,不是程序员自己写的)
  • ""包含的头文件,编译器默认会先在当前目录下寻找相应的头文件,如果没找到然后再到系统指定目录去寻找,如果还没找到则提示文件不存在

二、条件编译
1、#ifdef、#else、#endif使用

#include "stdio.h"
  
//#define NUM 1
#define NUM 

int main(void)
{
        int a = 0;
        #ifdef NUM		// 如果前面有定义NUM这个符号,成立
        a = 12;
        printf("#ifdef NUM.\n");
        #else				// 如果前面没有定义NUM这个符号,则执行下面的语句
        a = 222;
        printf("#elif.\n");
        #endif
        printf("a = %d.\n", a);
}

在这里插入图片描述2、#if、#else、#endif的使用

#include "stdio.h"

#define NUM 1

int main(void)
{
	int a = 0;
	#if (NUM == 0)		// 如果前面有定义NUM这个符号,成立
	a = 111;
	printf("#ifdef NUM.\n");
	#else					// 如果前面没有定义NUM这个符号,则执行下面的语句
	a = 222;
	printf("#elif.\n");
	#endif
	return 0;
}

在这里插入图片描述3、#if、#elif、#endif和#if、#else if、#endif的使用

  • #if、#elif、#endif的使用
#include "stdio.h"
int main(void)
{
	#if 0				// 在文本替换中,需要满足非0即true的情况下就会执行此代码
	printf("写法一 \n");
	#elif 5			// 在文本替换中,需要满足非0即true的情况下就会执行此代码
	printf("写法一  elif\n");
	#endif			// 在文本替换中,这里面的代码一定会执行的
	printf("写法一  endif\n");
	return 0;
}

在这里插入图片描述

  • #if、#else if、#endif的使用
#include "stdio.h"
int main(void)
{
	#if 0				// 在文本替换中,需要满足非0即true的情况下就会执行此代码
	printf("写法一 \n");
	#else if 5			// 在文本替换中,需要满足非0即true的情况下就会执行此代码
	printf("写法一  else if\n");
	#endif			// 在文本替换中,这里面的代码一定会执行的
	printf("写法一  endif\n");
	return 0;
}

在这里插入图片描述

三、宏定义
1、当一个数字直接出现在程序中时,它的是类型默认是int

#include "stdio.h"
  
#define SEC_PER_YEAR    (31506000)

int main(void)
{
        unsigned int l = SEC_PER_YEAR;
        printf("l = %u.\n", l);
        return 0;
}

在这里插入图片描述
四、文件包含
1、文件包含有两种格式:#include<文件名>和#include “文件名”

  • <>专门用来包含系统提供的头文件(就是系统自带的,不是程序员自己写的)
  • ""包含的头文件,编译器默认会先在当前目录下寻找相应的头文件,如果没找到然后再到系统指定目录去寻找,如果还没找到则提示文件不存在

2、文件包含的实例

1、首先新建一个test.h头文件
// 声明一个方法,相当于Java的接口定义
void onShow();
2、新建一个test.c文件,然后再实现test.h头文件里面定义的方法
#include "test.h" // 查找当前我们能看到的文件
#include <stdio.h>  插件C配置环境

void onShow(){
        printf("onShow method run。。\n");
} 
3、新建一个main.c文件,在该文件中调用onShow()方法
#include <stdio.h>
#include "test.h"

int main(void)
{
        onShow();
        return 0;
}

执行编译命令:gcc main.c -o main(报如下错误)
在这里插入图片描述解决办法:gcc -c test.c、gcc –c main.c、gcc -o main main.o test.o
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值