C++将函数声明放在头文件中的示例
本文可以看作是“C++多文件编程介绍” https://blog.csdn.net/cnds123/article/details/125905593 一文的补充说明。
C++函数原型声明(函数声明)的位置可以有以下几种选择:
1.函数声明放在同一源文件中:这种情况通常适用较小的项目中,通常可以将函数的声明和定义放在同一个源文件中。先声明函数原型,然后定义函数的实现。
2.函数声明放在头文件中,函数定义放在实现文件中。在大型项目中,常常将函数的声明放在一个或多个头文件中,然后将函数的定义放在对应的源文件中。头文件包含函数的原型,以及可能需要的其他声明(例如结构体、宏等),实现源文件则包含函数的具体实现。在另外的源文件(应用自定义头文件的源文件)中使用之。
下面给出示例。
★函数声明放在源文件中,这个常见,例如:
#include <iostream>
using namespace std;
// 函数声明
int add(int a, int b);
int main() {
int x = 5;
int y = 10;
int sum = add(x, y); //函数调用 ,x 和 y 是实参,它们的值被传递给 add 函数的形参 a 和 b
cout << "和: " << sum << endl;
return 0;
}
// 函数定义
int add(int a, int b) {
return a + b;
}
运行效果:
★函数声明放在自定义头文件中,函数定义放在实现源文件中,在另外的源文件(应用自定义头文件的源文件)中使用之。例如:
MathUtils.h文件(头文件)内容如下:
#ifndef MATHUTILS_H
#define MATHUTILS_H
// 函数声明
int add(int a, int b);
int subtract(int a, int b);
double multiply(double a, double b);
double divide(double a, double b);
#endif
说明,其中
#ifndef MATHUTILS_H
#define MATHUTILS_H
#endif
这是头文件保护宏(header guard)的常见用法。它们的作用是防止头文件的重复包含。
#ifndef MATHUTILS_H这个预处理指令检查是否已定义了名为 MATHUTILS_H 的宏。如果没有定义,表示这是第一次包含该头文件,那么就会执行 #define MATHUTILS_H。
#define MATHUTILS_H:这个预处理指令定义了名为 MATHUTILS_H 的宏。定义这个宏是为了防止多次包含同一个头文件时出现重定义的错误。
#endif:这个预处理指令结束条件编译块。它与 #ifndef 配套使用,将 #ifndef 和 #define 之间的代码包裹起来,确保只有当宏未定义时才会包含这些代码。
头文件保护机制是一个非常常见的做法,它能够确保头文件只被包含一次,避免了由于重复定义而引起的错误。
#ifndef和#define的标识符设置为对应头文件的名称。这样做的好处是可以确保每个头文件都有一个唯一的标识符,避免头文件重复包含的问题。标识符的命名通常会在头文件名称上加上一个下划线,以避免与其他标识符冲突。
例如,对于名为mathutils.h的头文件,我们可以这样设置#ifndef和#define的标识符:
#ifndef MATHUTILS_H
#define MATHUTILS_H
MathUtilsFunctions.cpp文件(头文件的实现源文件)内容如下:
#include "MathUtils.h"
// 函数实现
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
double multiply(double a, double b) {
return a * b;
}
double divide(double a, double b) {
return a / b;
}
mainAPP.cpp文件(应用头文件的源码文件)内容如下:
#include "MathUtils.h" // 自定义头文件
//#include "MathUtilsFunctions.cpp" // 不用包含自定义头文件中函数实现的源文件
#include <iostream>
using namespace std;
int main() {
int num1 = 10;
int num2 = 5;
int sum = add(num1, num2);
int difference = subtract(num1, num2);
double product = multiply(num1, num2);
double quotient = divide(num1, num2);
cout << "Sum: " << sum << endl;
cout << "Difference: " << difference << endl;
cout << "Product: " << product << endl;
cout << "Quotient: " << quotient << endl;
return 0;
}
这种方式可以有效地组织代码,提高代码的可维护性和可读性。同时,如果将来需要在其他源文件中使用这些函数,只需包含MathUtils.h头文件即可。
上面例子在mainAPP.cpp文件中只需包含自定义头文件即可。
要使用Dev-C++编译和运行带有自定义头文件的C++源代码的步骤如下:
打开Dev-C++,创建一个新项目。
项目类型选Basic页中的Console Application,并为项目起一个名称
在项目中,选择“文件”->“新建”->“源文件”,
添加MathUtils.h、MathUtilsFunctions.cpp、mainAPP.cpp文件
编译运行效果如下:
附、在window系统中使用g++编译器编译
如果你在Windows系统上使用g++编译器来编译前面给出的例子,可以按照以下步骤进行:
确保你已经安装了g++编译器。你可以在命令行中输入g++ --version来检查是否已经安装。
1、打开命令提示符cmd或PowerShell,并导航到存储了源代码文件(mainAPP.cpp和functions.cpp)的目录。
2、使用以下命令将两个源代码文件编译为可执行文件(假设头文件header.h位于与main.cpp和MathUtilsFunctions.cpp相同的目录中,你想将可执行文件命名为"program.exe"):
g++ mainAPP.cpp MathUtilsFunctions.cpp -o program.exe
如果代码中没有错误,编译过程将会成功,并且会生成一个名为"program.exe"的可执行文件。
3、双击该可执行文件或者在命令行中输入.\program.exe来运行程序。程序将会在命令行窗口中显示输出结果。