多头文件编译中需要注意的问题

最近在Coursea上Algorithm课学习,顺便自己也实现一下。建立了很多的头文件也遇到了一些问题,下面记录一下我的心得。

  • 首先很重要的一点

    • 因为头文件很多,你可能会在文件开头引用别的很多头文件,而这些头文件之间也有复杂的引用串联关系,容易引起混乱。特别是,如果你经常使用VS,你要了解这个宇宙第一IDE的工程特点,从源码如何一步步到目标代码(-o),再通过链接生成可执行代码的过程。(编译一般检查语法问题,链接上更容易出问题)。

    • 我的建议是每个头文件都加上 #pragma once的注释,这样后面就很省心了。很好的解决了多头文件之间的依赖。

  • 其次,.h和.cpp文件分开

    • 你可能要问为什么?我也是摸索过来的。
    • 如果你没有分开,有些方法的实现写在了.h文件内部就会报下面这种错误。

Dijsktra.obj : error LNK2005: "public: __thiscall DirectedEdge::DirectedEdge(void)" (??0DirectedEdge@@QAE@XZ) 已经在 DAG.obj 中定义
1>Dijsktra.obj : error LNK2005: "public: __thiscall DirectedEdge::~DirectedEdge(void)" (??1DirectedEdge@@QAE@XZ) 已经在 DAG.obj 中定义
1>Dijsktra.obj : error LNK2005: "public: int __thiscall DirectedEdge::getFrom(void)" (?getFrom@DirectedEdge@@QAEHXZ) 已经在 DAG.obj 中定义
1>Dijsktra.obj : error LNK2005: "public: int __thiscall DirectedEdge::getTo(void)" (?getTo@DirectedEdge@@QAEHXZ) 已经在 DAG.obj 中定义
1>Dijsktra.obj : error LNK2005: "public: float __thiscall DirectedEdge::getWeight(void)" (?getWeight@DirectedEdge@@QAEMXZ) 已经在 DAG.obj 中定义
1>test.obj : error LNK2005: "public: __thiscall DirectedEdge::DirectedEdge(void)" (??0DirectedEdge@@QAE@XZ) 已经在 DAG.obj 中定义
1>test.obj : error LNK2005: "public: __thiscall DirectedEdge::~DirectedEdge(void)" (??1DirectedEdge@@QAE@XZ) 已经在 DAG.obj 中定义
1>test.obj : error LNK2005: "public: int __thiscall DirectedEdge::getFrom(void)" (?getFrom@DirectedEdge@@QAEHXZ) 已经在 DAG.obj 中定义
1>test.obj : error LNK2005: "public: int __thiscall DirectedEdge::getTo(void)" (?getTo@DirectedEdge@@QAEHXZ) 已经在 DAG.obj 中定义
1>test.obj : error LNK2005: "public: float __thiscall DirectedEdge::getWeight(void)" (?getWeight@DirectedEdge@@QAEMXZ) 已经在 DAG.obj 中定义
1>D:\Develop\WorkSpace\CProject\dailyPractice\Algorithm\GraphTest\Debug\GraphTest.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

  • 当然,这是我遇到的一个具体问题,就是因为DirectedEdge类中的实现方法放在了.h文件中导致的。.h和.cpp分开,条理也更加清楚,内容更明确,何乐而不为呢?或者,当然也能解决这个问题,那就是在.h中实现的每个方法前都要加上inline内联这个声明,至于原理自己可以多搜索了解,同样能够解决问题。

你可能感兴趣的:(开发)