C++ 多目录多文件编译 技巧
2024-08-29 14:11:56
http://www.cplusplus.com/forum/articles/10627/
1.hpp文件
hpp文件可以使用template函数和class静态函数(不含静态成员)
a)不可包含全局对象和全局函数
由于hpp本质上是作为.h被调用者include,所以当hpp文件中存在全局对象或者全局函数,而该hpp被多个
调用者include时,将在链接时导致符号重定义错误。要避免这种情况,需要去除全局对象,将全局函数封
装为类的静态方法。
b)类之间不可循环调用
在.h和.cpp的场景中,当两个类或者多个类之间有循环调用关系时,只要预先在头文件做被调用类的声明
即可,如下:
class B;
class A{
public:
void someMethod(B b);
};
class B{
public:
void someMethod(A a);
};
在hpp场景中,由于定义与实现都已经存在于一个文件,调用者必需明确知道被调用者的所有定义,而不能等到cpp
中去编译。因此hpp中必须整理类之间调用关系,不可产生循环调用。同理,对于当两个类A和B分别定义在各自的
hpp文件中,形如以下的循环调用也将导致编译错误:
//a.hpp
#include "b.hpp"
class A{
public:
void someMethod(B b);
};
//b.hpp
#include "a.hpp"
class B{
public:
void someMethod(A a);
} c)不可使用静态成员
静态成员的使用限制在于如果类含有静态成员,则在hpp中必需加入静态成员初始化代码,当该hpp被多个文档include时,将产生符号重定义错误。
2.
#ifndef MATH_HPP_
#define MATH_HPP_
//内容
#endif
3.多个类互相包含使用指针,不要用成员。
最新文章
- 2016弱校联盟十一专场10.3---Similarity of Subtrees(深搜+hash、映射)
- 【Netty学习】 ChannelInitializer 学习
- python扫描内网banner信息
- SpringJUnit4加载类目录下(src)和WEF-INF目录下的配置文件
- prefuse学习(一)用非数据库连接和xml的方式读入数据
- spring与axis2整合发布webservice
- python列表推导和字典推导
- c语言,变长数组
- linux脚本后台监控执行指定程序的状态(假设程序是死的重新启动程序)
- Android非常实用的开源项目框架
- OSPF 高级实验
- ring0与ring3通信方式
- 记录一次程序输出和DB查询不匹配的问题
- JavaSE 软件工程师 认证考试试卷2
- bzoj2870最长道路tree——边分治
- SpringBank 开发日志 一种简单的拦截器设计实现
- [JS] ECMAScript 6 - String, Number, Function : compare with c#
- 当超强台风“山竹”即将冲进南海,Power BI 你怎么看?
- JFinal中文件上传后会默认放置到WebContent的upload包下,但是tomcat会自动重启,当我们再次打开upload文件夹查看我们刚刚上传的文件时,发现上传的文件已经没有了。
- Codeforces Round #540 (Div. 3)--1118B - Tanya and Candies(easy TL!)
热门文章
- 关于 div 的 contenteditable 使用,placeholder 和 复制图片显示并上传,按住 enter+ctrl 内容换行
- 转载的web server实例
- 实验隐藏参数";_allow_resetlogs_corruption";的使用
- HTML 鼠标坐标和元素坐标
- java.lang.ClassNotFoundException: com.sun.xml.ws.spi.ProviderImpl解决办法
- TheFatRat一般使用
- PowerShell 语法备忘
- [Luogu]A%BProblem——线性筛素数与前缀和
- java8学习笔记之lambda表达式
- GO数据类型