c++如何在主函数文件中调用其他函数文件

 更新时间:2023年08月02日 10:07:45   作者:Dust_Evc  
这篇文章主要介绍了c++如何在主函数文件中调用其他函数文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

c++在主函数文件中调用其他函数文件

方法介绍

可以把多个需要调用的子函数声明在一个头文件中。

具体是:

1. 函数的定义写在源文件(A.cpp)

2. 把函数的声明写在头文件(B.h)里(不必与源文件同名)

3. 在源文件(A.cpp)以及要使用这些函数的源文件中加入 #include  "B.h"

例如:

如果子函数引用了string,可以直接在头文件中加上:

#include <string>
using namespace std;

这样就不必在主文件中引用这些头文件。

如果在头文件中声明和定义函数,有两种方法:

1、直接在头文件中声明和定义这些子函数,然后在其它文件中引用头文件,编译时,需要加上相应头文件;

2、在头文件中声明这些子函数,然后在子函数的cpp文件中,写这些子函数的定义,同时引用该头文件,使用子函数,只需在相应的cpp文件中引用相应头文件即可,编译时需要加上相应头文件和cpp文件;

注意事项:

1、如果使用头文件中声明的子函数,需要在相应的引用该头文件的cpp文件开头(引用头文件之后),加上引用外部子函数的声明:

extern int func1(int var1, string str1);
extern int func2(int var2, string str2);
......

2、为了防止头文件重复调用出错,需要在头文件开头和结束的地方加上防止重复调用的条件编译开关:

#ifndef XXX_H
#define XXX_H
......
#endif

示例1

文件fu.cpp

#include "Funs.h" 
/*求两个数的最大值函数*/
int max(int a, int b) 
{
	return a > b ? a : b;
}

文件Funs.h

#pragma once
#ifndef FUNS_H
#define FUNS_H
/*求两个数的最大值函数*/
int max(int, int);
#endif

文件main.cpp

#include <stdio.h>
#include "Funs.h"  
int main() 
{
	int a = 12, b = 9;
	int c = max(a, 9);
	printf("%d和%d中的最大值为:%d\n", a, b, c);
	return 0;
}

示例2

写个头文件(a.h),对调用文件(fun.cpp)里的函数进行申明。

再将头文件引在主函数所在的文件(main.cpp)里。

如下面所示:

文件fun.cpp

#include "Funs.h" 
int display(int a,int b)
{
    cout<<a+b<<endl;
    return 0;
}

文件a.h

#pragma once
#ifndef A_H
#define A_H
#include <iostream>
int display(int ,int );
#endif

文件main.cpp

#include "a.h"
int main()
{
    int a=2,b=3;
    display(a,b);
    return 0;
}

简单写几行,使用非本源文件的函数就需要文件包含方式来包含其他文件,注意好头文件别重复

示例3

链接:https://www.jb51.net/article/276187.htm

理解函数调用的过程

程序在内存中的占用

要学习C语言中函数调用的过程,必须要知道程序在内存中各个区域的分布。

C语言的函数调用的过程主要分布在栈中,所以我们今天主要研究栈。

几个基本的汇编指令

call:

  • 将当前指令的下一条指令的地址保存到栈中。
  • 跳转至目标函数的地址。

ret :

  • 弹出栈顶地址将数据放入eip
  • 从栈顶入栈称为push
  • 从栈底出栈称为pop

常用寄存器

在CPU中:读取指令(内存-->CPU)-->分析指令(CPU)-->执行指令(CPU)

1.  EAX:累积暂存器,EBX:基底暂存器,ECX:计数暂存器,EDX:资料暂存器

2. EIP(pc):程序计数器(用来存放当前正在执行指令的下一条指令的地址)

3. ESP:栈顶

4. EBP:栈底

函数的调用与栈帧的创建销毁

实例函数:

转换成汇编语言:

首先由_tmainCRTStartup调用main函数,并在栈中创建了一个栈帧。

分别把a和b的值压入栈中:

创建b,a临时变量压栈。

call指令保存当前指令下一条计数器的值,并跳转到指定地址。

创建新的栈帧myadd

定义z,并计算a+b,并返回z的值到main中

将a+b的值赋给c。

到这里函数的调用就结束了。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Matlab实现三维投影绘制的示例代码

    Matlab实现三维投影绘制的示例代码

    这篇文章系小编为大家带来了一个三维投影绘制函数(三视图绘制),函数支持三维曲线、曲面、三维多边形、参数方程曲线、参数方程曲面的投影绘制,需要的可以参考一下
    2022-08-08
  • C++实现自底向上的归并排序算法

    C++实现自底向上的归并排序算法

    这篇文章主要介绍了C++实现自底向上的归并排序算法,结合实例形式较为详细的分析总结了自底向上的归并排序算法的原理与具体实现技巧,需要的朋友可以参考下
    2015-12-12
  • 用C语言实现三子棋

    用C语言实现三子棋

    这篇文章主要为大家详细介绍了用C语言实现三子棋,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C语言图书管理系统实验

    C语言图书管理系统实验

    这篇文章主要为大家详细介绍了C语言图书管理系统实验,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++中的类扩展之继承和组合详解

    C++中的类扩展之继承和组合详解

    在C++中,类扩展可以通过继承、组合和装饰模式实现。继承可以实现对已有类的修改和扩展,组合可以增加新的功能,装饰模式则能够在不改变原类的情况下为其添加新的功能。这些技术在C++程序设计中应用广泛,提高了程序的可扩展性和可维护性
    2023-04-04
  • C++解决大数组栈内存不够问题的方法分析

    C++解决大数组栈内存不够问题的方法分析

    这篇文章主要介绍了C++解决大数组栈内存不够问题的方法,结合实例形式对比分析了C++针对大数组栈内存不足情况的常见解决方法及其优缺点,具有一定参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • C语言进阶教程之循环语句缺陷详析

    C语言进阶教程之循环语句缺陷详析

    循环语句是用于重复执行某条语句(循环体)的语句,它包含一个控制表达式,每循环执行一次都要对控制表达式进行判断,如果表达式为真,则继续执行循环,这篇文章主要给大家介绍了关于C语言进阶教程之循环语句缺陷的相关资料,需要的朋友可以参考下
    2021-08-08
  • C语言实现循环队列基本操作

    C语言实现循环队列基本操作

    这篇文章主要为大家详细介绍了C语言实现循环队列基本操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C/C++获取当前时间的方法总结(最全)

    C/C++获取当前时间的方法总结(最全)

    这篇文章主要为大家整理了C/C++中获取当前时间的最全方法,文中的示例代码讲解详细,具有一定的学习和借鉴价值,需要的可以了解一下
    2023-03-03
  • 约瑟夫经典问题扩展成双向约瑟夫问题

    约瑟夫经典问题扩展成双向约瑟夫问题

    今天小编就为大家分享一篇关于约瑟夫经典问题扩展成双向约瑟夫问题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03

最新评论