c++如何在主函數(shù)文件中調(diào)用其他函數(shù)文件
c++在主函數(shù)文件中調(diào)用其他函數(shù)文件
方法介紹
可以把多個(gè)需要調(diào)用的子函數(shù)聲明在一個(gè)頭文件中。
具體是:
1. 函數(shù)的定義寫在源文件(A.cpp)里
2. 把函數(shù)的聲明寫在頭文件(B.h)里(不必與源文件同名)
3. 在源文件(A.cpp)以及要使用這些函數(shù)的源文件中加入 #include "B.h"
例如:
如果子函數(shù)引用了string,可以直接在頭文件中加上:
#include <string> using namespace std;
這樣就不必在主文件中引用這些頭文件。
如果在頭文件中聲明和定義函數(shù),有兩種方法:
1、直接在頭文件中聲明和定義這些子函數(shù),然后在其它文件中引用頭文件,編譯時(shí),需要加上相應(yīng)頭文件;
2、在頭文件中聲明這些子函數(shù),然后在子函數(shù)的cpp文件中,寫這些子函數(shù)的定義,同時(shí)引用該頭文件,使用子函數(shù),只需在相應(yīng)的cpp文件中引用相應(yīng)頭文件即可,編譯時(shí)需要加上相應(yīng)頭文件和cpp文件;
注意事項(xiàng):
1、如果使用頭文件中聲明的子函數(shù),需要在相應(yīng)的引用該頭文件的cpp文件開(kāi)頭(引用頭文件之后),加上引用外部子函數(shù)的聲明:
extern int func1(int var1, string str1); extern int func2(int var2, string str2); ......
2、為了防止頭文件重復(fù)調(diào)用出錯(cuò),需要在頭文件開(kāi)頭和結(jié)束的地方加上防止重復(fù)調(diào)用的條件編譯開(kāi)關(guān):
#ifndef XXX_H #define XXX_H ...... #endif
示例1
文件fu.cpp
#include "Funs.h"
/*求兩個(gè)數(shù)的最大值函數(shù)*/
int max(int a, int b)
{
return a > b ? a : b;
}文件Funs.h
#pragma once #ifndef FUNS_H #define FUNS_H /*求兩個(gè)數(shù)的最大值函數(shù)*/ 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
寫個(gè)頭文件(a.h),對(duì)調(diào)用文件(fun.cpp)里的函數(shù)進(jìn)行申明。
再將頭文件引在主函數(shù)所在的文件(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;
}簡(jiǎn)單寫幾行,使用非本源文件的函數(shù)就需要文件包含方式來(lái)包含其他文件,注意好頭文件別重復(fù)
示例3
鏈接:http://www.dhdzp.com/article/276187.htm
理解函數(shù)調(diào)用的過(guò)程
程序在內(nèi)存中的占用
要學(xué)習(xí)C語(yǔ)言中函數(shù)調(diào)用的過(guò)程,必須要知道程序在內(nèi)存中各個(gè)區(qū)域的分布。

C語(yǔ)言的函數(shù)調(diào)用的過(guò)程主要分布在棧中,所以我們今天主要研究棧。
幾個(gè)基本的匯編指令
call:
- 將當(dāng)前指令的下一條指令的地址保存到棧中。
- 跳轉(zhuǎn)至目標(biāo)函數(shù)的地址。
ret :
- 彈出棧頂?shù)刂穼?shù)據(jù)放入eip
- 從棧頂入棧稱為push
- 從棧底出棧稱為pop
常用寄存器
在CPU中:讀取指令(內(nèi)存-->CPU)-->分析指令(CPU)-->執(zhí)行指令(CPU)
1. EAX:累積暫存器,EBX:基底暫存器,ECX:計(jì)數(shù)暫存器,EDX:資料暫存器
2. EIP(pc):程序計(jì)數(shù)器(用來(lái)存放當(dāng)前正在執(zhí)行指令的下一條指令的地址)
3. ESP:棧頂
4. EBP:棧底
函數(shù)的調(diào)用與棧幀的創(chuàng)建銷毀
實(shí)例函數(shù):

轉(zhuǎn)換成匯編語(yǔ)言:

首先由_tmainCRTStartup調(diào)用main函數(shù),并在棧中創(chuàng)建了一個(gè)棧幀。
分別把a(bǔ)和b的值壓入棧中:


創(chuàng)建b,a臨時(shí)變量壓棧。


call指令保存當(dāng)前指令下一條計(jì)數(shù)器的值,并跳轉(zhuǎn)到指定地址。


創(chuàng)建新的棧幀myadd


定義z,并計(jì)算a+b,并返回z的值到main中



將a+b的值賦給c。

到這里函數(shù)的調(diào)用就結(jié)束了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Matlab實(shí)現(xiàn)三維投影繪制的示例代碼
這篇文章系小編為大家?guī)?lái)了一個(gè)三維投影繪制函數(shù)(三視圖繪制),函數(shù)支持三維曲線、曲面、三維多邊形、參數(shù)方程曲線、參數(shù)方程曲面的投影繪制,需要的可以參考一下2022-08-08
C語(yǔ)言圖書管理系統(tǒng)實(shí)驗(yàn)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言圖書管理系統(tǒng)實(shí)驗(yàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++解決大數(shù)組棧內(nèi)存不夠問(wèn)題的方法分析
這篇文章主要介紹了C++解決大數(shù)組棧內(nèi)存不夠問(wèn)題的方法,結(jié)合實(shí)例形式對(duì)比分析了C++針對(duì)大數(shù)組棧內(nèi)存不足情況的常見(jiàn)解決方法及其優(yōu)缺點(diǎn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05
C語(yǔ)言進(jìn)階教程之循環(huán)語(yǔ)句缺陷詳析
循環(huán)語(yǔ)句是用于重復(fù)執(zhí)行某條語(yǔ)句(循環(huán)體)的語(yǔ)句,它包含一個(gè)控制表達(dá)式,每循環(huán)執(zhí)行一次都要對(duì)控制表達(dá)式進(jìn)行判斷,如果表達(dá)式為真,則繼續(xù)執(zhí)行循環(huán),這篇文章主要給大家介紹了關(guān)于C語(yǔ)言進(jìn)階教程之循環(huán)語(yǔ)句缺陷的相關(guān)資料,需要的朋友可以參考下2021-08-08
C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列基本操作
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)循環(huán)隊(duì)列基本操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
C/C++獲取當(dāng)前時(shí)間的方法總結(jié)(最全)
這篇文章主要為大家整理了C/C++中獲取當(dāng)前時(shí)間的最全方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)和借鑒價(jià)值,需要的可以了解一下2023-03-03
約瑟夫經(jīng)典問(wèn)題擴(kuò)展成雙向約瑟夫問(wèn)題
今天小編就為大家分享一篇關(guān)于約瑟夫經(jīng)典問(wèn)題擴(kuò)展成雙向約瑟夫問(wèn)題,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03

