c++如何在主函數(shù)文件中調用其他函數(shù)文件
c++在主函數(shù)文件中調用其他函數(shù)文件
方法介紹
可以把多個需要調用的子函數(shù)聲明在一個頭文件中。
具體是:
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ù),然后在其它文件中引用頭文件,編譯時,需要加上相應頭文件;
2、在頭文件中聲明這些子函數(shù),然后在子函數(shù)的cpp文件中,寫這些子函數(shù)的定義,同時引用該頭文件,使用子函數(shù),只需在相應的cpp文件中引用相應頭文件即可,編譯時需要加上相應頭文件和cpp文件;
注意事項:
1、如果使用頭文件中聲明的子函數(shù),需要在相應的引用該頭文件的cpp文件開頭(引用頭文件之后),加上引用外部子函數(shù)的聲明:
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" /*求兩個數(shù)的最大值函數(shù)*/ int max(int a, int b) { return a > b ? a : b; }
文件Funs.h
#pragma once #ifndef FUNS_H #define FUNS_H /*求兩個數(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
寫個頭文件(a.h),對調用文件(fun.cpp)里的函數(shù)進行申明。
再將頭文件引在主函數(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; }
簡單寫幾行,使用非本源文件的函數(shù)就需要文件包含方式來包含其他文件,注意好頭文件別重復
示例3
鏈接:http://www.dbjr.com.cn/article/276187.htm
理解函數(shù)調用的過程
程序在內存中的占用
要學習C語言中函數(shù)調用的過程,必須要知道程序在內存中各個區(qū)域的分布。
C語言的函數(shù)調用的過程主要分布在棧中,所以我們今天主要研究棧。
幾個基本的匯編指令
call:
- 將當前指令的下一條指令的地址保存到棧中。
- 跳轉至目標函數(shù)的地址。
ret :
- 彈出棧頂?shù)刂穼?shù)據(jù)放入eip
- 從棧頂入棧稱為push
- 從棧底出棧稱為pop
常用寄存器
在CPU中:讀取指令(內存-->CPU)-->分析指令(CPU)-->執(zhí)行指令(CPU)
1. EAX:累積暫存器,EBX:基底暫存器,ECX:計數(shù)暫存器,EDX:資料暫存器
2. EIP(pc):程序計數(shù)器(用來存放當前正在執(zhí)行指令的下一條指令的地址)
3. ESP:棧頂
4. EBP:棧底
函數(shù)的調用與棧幀的創(chuàng)建銷毀
實例函數(shù):
轉換成匯編語言:
首先由_tmainCRTStartup調用main函數(shù),并在棧中創(chuàng)建了一個棧幀。
分別把a和b的值壓入棧中:
創(chuàng)建b,a臨時變量壓棧。
call指令保存當前指令下一條計數(shù)器的值,并跳轉到指定地址。
創(chuàng)建新的棧幀myadd
定義z,并計算a+b,并返回z的值到main中
將a+b的值賦給c。
到這里函數(shù)的調用就結束了。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。