C语言多文件编程问题解析

 更新时间:2022年12月27日 08:58:53   作者:编程远泊  
在某些场景中,考虑到编译效率和可移植性,#pragma once 和 #ifndef 经常被结合使用来避免头文件被 重复引入,这里介绍用 _Pragma 操作符避免头文件重复引入的问题,感兴趣的朋友跟随小编一起看看吧

1 为什么要使用多文件编程

在大型的综合项目中,是由很多具有不同的功能的代码构成,不可能将所有的代码都写到一个文件中,

而是采用多文件的方式对代码进行管理,将具有不同功能的代码写到不同的文件中。 比如:led灯的驱动代码写到led.c文件,beep驱动的代码写到beep.c中,key驱动代码写到key.c中…

2 多文件编程的使用方法

源文件:指.c文件,主要存放的是头文件的包含,变量定义,函数的定义

头文件:指.h文件,主要存放的是宏定义,函数的声明,已经其他头文件的包含

防止头文件的重复包含的机制:

#ifndef 头文件名大写_H

#define 头文件名大写_H

头文件中书写的宏定义及函数的声明;

#endif

当头文件第一次被包含时,判断"头文件名大写_H"宏定义是否被定义,

如果没有定义,则头文件中的代码会被展开,并且定义"头文件名大写_H"宏定义。

当头文件第二次被包含时,判断"头文件名大写_H"宏定义是否被定义,

由于"头文件名大写_H"宏已经被定义,则头文件中的代码将不会被展开。

在书写自己的头文件时,首先手写头文件的重复包含的机制。

重复包含机制中的宏定义的名字可以书写其他的名字,但是"头文件名大写_H"已经成为一种约定俗称的用法。

3 多文件编程的练习

将C基础中的冒泡排序的代码使用多文件编程的方式实现:

冒泡排序的代码封装成函数,写到bubbling.c文件中, 函数的声明写到bubbling.h文件中, 在main.c文件中调用冒泡排序的函数。

bubbling.h文件:

#ifndef __BUBBLING_H__
#define __BUBBLING_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void bubbling(int *s,int len);
void print(int *s);
#endif

bubbling.c文件:

#include "bubbling.h"
void bubbling(int *s,int len)
{
    for(int j = 0; j < len-1; j++){
		//内层循环控制一趟排序
		for(int i = 0; i < len-1-j; i++){
					//此处的 -1 是防止越界访问的
					//此处的 -j 是因为每趟都可以少比较一个元素
			if(s[i] > s[i+1]){//如果是降序 只需要将此处的 > 改成 < 即可
				//交换
				int temp = s[i];
				s[i] = s[i+1];
				s[i+1] = temp;
			}
		}
	}
    return 0;
}

print.c文件

#include "bubbling.h"
void print(int *s){
    //排序前
	int i = 0;
	int j = 0;
	for(i = 0 ; i < 10; i++){
		printf("%d  ", s[i]);
	}
	printf("\n");
}

main.c文件

#include "bubbling.h"
int main(int argc, const char *argv[])
{
    /*your code*/
    int s[10] = {11, 22, 43, 567, 1, 4, 9, 8, 55, 98};
	int len = sizeof(s)/sizeof(s[0]);//数组的长度:元素的个数
	int temp = 0;
    print(s);
    bubbling(s,10);
    print(s);
    return 0;
}

到此这篇关于C语言多文件编程问题解析的文章就介绍到这了,更多相关C语言多文件编程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c语言算术运算符越界问题解决方案

    c语言算术运算符越界问题解决方案

    大量的安全漏洞是由于计算机算术运算的微妙细节引起的, 具体的C语言, 诸如符号数和无符号数之间转换, 算术运算的越界都会导致不可预知的错误和安全漏洞, 具体的案例数不胜数.
    2012-11-11
  • C++模拟实现STL容器vector的示例代码

    C++模拟实现STL容器vector的示例代码

    这篇文章主要为大家详细介绍了C++如何模拟实现STL容器vector的相关资料,文中的示例代码讲解详细,对我们学习C++有一定帮助,需要的可以参考一下
    2022-11-11
  • C++中register关键字举例详解

    C++中register关键字举例详解

    register用来声明变量,然后声明出来的变量是直接放在cpu的寄存器当中,而非就是通过内存寻址访问,这样效率更高,下面这篇文章主要给大家介绍了关于C++中register关键字的相关资料,需要的朋友可以参考下
    2023-03-03
  • visual studio 2022一个不易发现的问题

    visual studio 2022一个不易发现的问题

    本文主要介绍了visual studio 2022一个不易发现的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C语言结构体指针案例解析

    C语言结构体指针案例解析

    这篇文章主要介绍了C语言结构体指针案例解析,本文通过例子来解释说明了C语言的结构体概念和如何用指针去操作结构体,文章标明了详细的代码,需要的朋友可以参考下
    2021-07-07
  • C语言由浅入深讲解线程的定义

    C语言由浅入深讲解线程的定义

    这篇文章主要介绍了C语言中线程的基础知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C++使用VLD检测内存泄漏

    C++使用VLD检测内存泄漏

    本文主要介绍了C++使用VLD检测内存泄漏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • C++中volatile限定符的实现示例

    C++中volatile限定符的实现示例

    volatile关键字在C和C++中用于确保编译器不优化特定变量的访问,主要用于多线程和硬件交互场景,本文就来介绍C++中volatile限定符的实现示例,感兴趣的可以了解一下
    2024-11-11
  • 深入理解C++移位运算符

    深入理解C++移位运算符

    下面小编就为大家带来一篇深入理解C++移位运算符。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • C语言光标旋转与倒计时功能实现示例详解

    C语言光标旋转与倒计时功能实现示例详解

    这篇文章主要为大家介绍了C语言实现光标旋转与倒计时功能的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11

最新评论