我是现在公司的新成员,正在研究由我的直接团队负责人撰写的项目.该公司通常不使用C++,但我的同事用C/C++编写了高效的代码.只有我们知道如何用C++编写代码(我和我的领导,所以没有第三种意见可以参与).
在我对项目有足够的了解之后,我意识到整个结构都是...... 特别的.
它实际上由一个编译单元组成,其中makefile列为唯一的源代码main.hpp.
然后,此头文件包含项目所包含的所有源文件,因此它看起来像一个非常大的列表:
#include "foo.cpp"
#include "bar.cpp"
在尝试理解它背后的逻辑时,我意识到这确实适用于这个项目,因为它只是一个接口,每个单元可以在不访问任何其他单元的情况下运行,在某些时候我问他为什么这样做的原因是什么这条路.
我对这个论点采取了防御性的反应
嗯,它有效,不是吗?如果您认为对您更好,您可以自由地按照自己的方式行事.
这就是我现在正在做的事情,仅仅因为我在思考这个结构时遇到了麻烦.所以现在我将"通常"结构应用到我现在正在编写的实现中,同时只对整个项目进行必要的更改,以演示我将如何设计它.
我认为存在许多缺点,从混合链接器和编译器开始,通过自己的项目结构工作不能很好地服务,直到优化可能以冗余或模糊的结果结束,更不用说项目的干净构建需要大约30分钟,我认为可能也是由结构引起的.但我缺乏知名度的知识,而不仅仅是假设的问题.
而他的论点是"它按我的方式工作,不是吗?" 是的,我希望能够向他解释为什么这是一个坏主意,而不是作为新的挑剔的家伙过来.
那么这样的项目结构究竟会导致什么问题呢?或者我反应过度,这样的结构完全没问题?
所以我正在努力创建我的第一个单元测试。我正在使用 Google Test,该版本目前内置于 Visual Studio 2017 中。这是对概念验证的一次尝试,非常简单。
我在测试代码的解决方案中有一个项目:test.cpp
#include "pch.h"
#include "../ConsoleApplication1/ConsoleApplication1.cpp"
TEST(SumTest, FirstTest) {
  EXPECT_EQ(6, sum(2, 4));
}
TEST(SumTest, SecondTest) {
    EXPECT_EQ(1, 1);
    EXPECT_TRUE(true);
}
我有一个简单的方法可以在 ConsoleApplication1.cpp 中进行测试
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
int sum(int a, int b);
int main()
{
    int x = sum(2, 4);
    printf("The answer is: %d \n", x);
}
int sum(int a, int b) {
    return a + b;
}
一切都编译正常,但是当我从“测试资源管理器”菜单中单击“全部运行”时,我得到以下输出:
[5/7/2018 4:17:42 PM Informational] ------ …这个问题并不是重复" 为什么我不应该包含cpp文件而是使用标题? "而是更多的实践问题.
为了最好地构思这个问题,让我解释一下 在编写课程时,如果不是更多,它可以快速增长到几百行.出于可读性目的,我想基于每个方法将一个类分成单个文件.为了清楚起见,我并不是建议将整个项目变成一组包含,因为上面列出的帖子中提到的原因,而是将一个类分解为包含在他们自己的文件中的组件.
以下代码片段说明了我的意思
#include <iostream>
#include "helloClass.h"
using namespace std;
int main()
 {
         hello a;
         cout<<a.out();
         cin.get();//just to pause execution
 }
#ifndef HELLOCLASS_H
#define HELLOCLASS_H
#include <string>
class hello
{
std::string  message;
public:
std::string out();
hello();
};
#endif
#include "helloClass.h"     
using namespace std;        
hello::hello()              
{                           
   message = "Hello World!";   
};                          
#include "helloClassOut.cpp"
string hello::out()
{                  
return message;    
}                  
这将编译正常并按预期执行.当发生错误时我发现了一个额外的好处,因为编译器不仅会告诉你什么行,还会告诉你错误所在的文件.例如,我用未声明的变量编译它
$ c++ main.cpp helloClassMain.cpp -o hello
In file included from helloClassMain.cpp:8:0:
helloClassOut.cpp: In member …而不是做
#include "MyClass.cpp"
我想要做
#include "MyClass.h"
我在网上看到,不这样做被认为是不好的做法.
我正在使用C++开发一个小游戏,我使用了Eclipse CDT的类生成器.它创建了一个带有类定义的.h文件和一个包含所述类的无体方法的.cpp文件.
因此,如果我遵循模板,我将使用方法声明填充.cpp文件,并使用方法体填充.cpp文件.但是,我不能在另一个文件中包含.cpp文件.
那么C++中包含类和包含文件的约定是什么?我所做的是在.h文件中的类声明下填写方法体,并删除.cpp文件.