多个cpp文件关联对#include".h"和#include".cpp"理解

本文介绍了一个使用C++实现的三角形有效性验证及面积计算程序。通过定义三角形边长,程序首先判断这三条边是否能构成有效的三角形,并计算其面积。文章通过分离头文件和实现文件的方法组织代码,展示了如何正确地包含头文件进行函数声明与定义。

mytriangle.h
bool is_valid()
{
} 

double getarea()
{
}
mytriangle.cpp
#include"mytriangle.h"
#include<cstdio>
#include<cmath>
#define eps 1e-6

bool is_valid(double side1,double side2,double side3)
{
	if(side1+side2<side3+eps)
		return false;
	if(side1+side3<side2+eps)
		return false;
	if(side2+side3<side1+eps)
		return false;
	return true;
} 

double getarea(double side1,double side2,double side3)
{
	double area,s;
	s=(side1+side2+side3)/2;
	area=sqrt(s*(s-side1)*(s-side2)*(s-side3));
	return area;
}
4.5.cpp
#include"mytriangle.cpp"
#include<cstdio>

int main()
{
	double side1,side2,side3;
	scanf("%lf%lf%lf",&side1,&side2,&side3);
	if(!is_valid(side1,side2,side3))
	{
		printf("error");
		return 0;
	}
	printf("%.5f",getarea(side1,side2,side3));
	return 0;
}


这就是把3个文件连起来了,不是很理解为何不能在4.5cpp里直接调用mytriangle.h,然后上网查了查。

#include".h"include".cpp"本质上就是把那个文件里的代码复制到这个文件里!

于是以上程序本质上就全塞到了4.5.cpp里面,变成了

bool is_valid()
{
} 

double getarea()
{
}
#include<cstdio>
#include<cmath>
#define eps 1e-6

bool is_valid(double side1,double side2,double side3)
{
	if(side1+side2<side3+eps)
		return false;
	if(side1+side3<side2+eps)
		return false;
	if(side2+side3<side1+eps)
		return false;
	return true;
} 

double getarea(double side1,double side2,double side3)
{
	double area,s;
	s=(side1+side2+side3)/2;
	area=sqrt(s*(s-side1)*(s-side2)*(s-side3));
	return area;
}

#include<cstdio>

int main()
{
	double side1,side2,side3;
	scanf("%lf%lf%lf",&side1,&side2,&side3);
	if(!is_valid(side1,side2,side3))
	{
		printf("error");
		return 0;
	}
	printf("%.5f",getarea(side1,side2,side3));
	return 0;
}


在你的场景中: - `pch.h` 中已经包含 `#include "framework.h"` - 某些 `.cpp` 文件中又写了 `#include "framework.h"` **一般不会直接报错,但可能会带来潜在问题。** --- ## ✅ 回答:是否会报错? ### **默认情况下不会编译错误(error),但如果 framework.h 没有头文件保护,则可能引发重复定义错误(redefinition errors)。** --- ## 🧠 原理解释 ### 1. **什么是“头文件保护”?** 几乎所有的标准头文件(包括你自己写的)都应该使用宏来防止重复包含: ```cpp // framework.h #ifndef FRAMEWORK_H #define FRAMEWORK_H // 内容... #endif // FRAMEWORK_H ``` 如果有这样的保护机制,即使你多次写: ```cpp #include "framework.h" #include "framework.h" ``` 也不会出错。 --- ### 2. **预编译头的作用是什么?** - `pch.h` 是预编译头文件,在 Visual Studio 中通常用于加快编译速度。 - 所有 `.cpp` 文件顶部都必须包含 `#include "pch.h"`,否则会失去预编译优化。 - 如果你在 `pch.h` 中包含了 `framework.h`,那么它对所有 `.cpp` 文件都是全局可见的。 --- ### 3. **在 `.cpp` 文件中再次包含 `framework.h` 是否必要?** #### ❌ 不推荐: - 如果你已经在 `pch.h` 中包含过一次 `framework.h`,再在 `.cpp` 中包含它是多余的。 - 虽然不会出错(如果有头文件保护),但增加了维护成本阅读混乱。 #### ✅ 推荐做法: - 只在 `pch.h` 中包含一次即可。 - 在 `.cpp` 文件中只需要写: ```cpp #include "pch.h" #include "CMyClass.h" // 当前类对应的头文件 ``` --- ## 🔍 示例说明 ### ✅ 正确用法: ```cpp // pch.h #include "framework.h" // CMyClass.cpp #include "pch.h" #include "CMyClass.h" ``` ### ❌ 多余写法: ```cpp // CMyClass.cpp #include "pch.h" #include "framework.h" // 多余!已通过 pch.h 包含 #include "CMyClass.h" ``` --- ## ⚠️ 特殊情况:如果 `framework.h` 没有头文件保护 如果你的 `framework.h` 文件是这样写的: ```cpp // framework.h void SomeFunction(); // 没有 #ifndef 保护 ``` 然后你在多个地方包含它: ```cpp #include "pch.h" #include "framework.h" // 这里会再次包含 ``` 就可能导致: ``` error C2084: 函数“void SomeFunction(void)”已有主体 ``` 因为函数声明被重复了。 --- ## ✅ 总结对比表 | 场景 | 是否安全 | 原因 | |------|----------|------| | `framework.h` 有头文件保护 | ✅ 安全 | 多次包含无影响 | | `framework.h` 没有头文件保护 | ❌ 不安全 | 可能导致重复定义错误 | | `.cpp` 中重复包含 `framework.h` | ⚠️ 不推荐 | 虽然不报错,但冗余且易维护混乱 | | 使用预编译头并只在 `pch.h` 中包含一次 | ✅ 推荐做法 | 清晰、高效、避免冲突 | --- ##
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值