这是包含源文件的好习惯吗?

问题描述:

我正在使用函数。 是不是很好的做法,我在另一个.cpp文件中编写函数,并将其包含在主函数中? 像这样:#include“lehel.cpp”。这是包含源文件的好习惯吗?

这是好的,还是应该直接在main.cpp文件中写入函数?

+8

你可能想了解的头文件。 – jaggedSpire

+9

一个应该几乎/永远不会包含cpp文件 – NathanOliver

+2

这可能有所帮助:http://stackoverflow.com/questions/333889/why-have-header-files-and-cpp-files-in-c – vu1p3n0x

一个好的做法是将功能分成单独的软件单元,以便它们可以重复使用,以便更改一个单元对其他单元几乎没有影响。

如果main包含lehel.cpp,这意味着lehel.cpp中的任何更改都会强制编制main。但是,如果lehel.cpp单独编译并链接,则更改为lehel.cpp不会强制main重新编译;只有链接在一起。

恕我直言,头文件应包含如何使用函数的信息。源文件应该包含函数的实现。源文件中的功能应与主题相关联。另外,保持源文件的大小会减少注入缺陷的数量。

已建立的做法是将可重用函数的函数声明放入.h.hpp文件中,并将该文件包括在需要它们的位置。

Foo.cpp中

int foo() 
{ 
    return 42; 
} 

foo.hpp

#ifndef FOO_HPP // include guards 
#define FOO_HPP 

int foo(); 

#endif // FOO_HPP 

的main.cpp

#include "foo.hpp" 

int main() 
{ 
    return foo(); 
} 

包括.cpp文件只是有时被用来从声明分裂模板定义,但即使这种用法是有争议的,因为有反方案创建对(0 (foo.hppfoo_fwd.hpp)。

+0

因此,它更好,如果我在main.cpp文件中声明了该函数。我是一个初学者:) –

+0

我建议你只是创建一个头文件,而不是在main中声明它。 – krzaq

+0

的'的#pragma once'好处是,如果它不支持的编译器被允许悄悄地丢弃它,留给你不知道你有没有包括警卫。可笑的hi-jinks随之而来。它也有一些与符号链接和网络挂载有关的问题,除了它只是桃色之外。确保你的编译器支持扩展,并且你不会移植到其他编译器,并保持你的编译系统简单和本地,你很好。 – user4581301

头文件(.h)旨在提供多个文件所需的信息。像类声明,函数原型和枚举这样的东西通常放在头文件中。总之,“定义”。

代码文件(.cpp)旨在提供只需要在一个文件中知道的实现信息。通常,函数体和内部变量应该/将永远不会被其他模块访问,属于.cpp文件。总之,“实施”。

最简单的问题来问问自己,以确定什么属于哪里“如果我改变这个,我将不得不改变其他文件中的代码,使事情再次编译?”如果答案是“是”,它可能属于头文件;如果答案是“否”,它可能属于代码文件。

https://stackoverflow.com/a/1945866/3323444

要回答你的问题,作为一个程序员这将是一个不好的做法,增加一个功能,当CPP给你头文件包含。

通常它不这样做(和头被使用)。然而,有一种称为“合并”的技术,这意味着将所有(或一堆).cpp文件包括在一个主要的.cpp文件中,并将其构建为一个单元。

为什么它可能有时做的原因是:

  • 有时竟快相比,分别建立的所有文件(其中一个原因可能是,例如,该首部宣读了“联军”大单元的编译时间只有一次,而不是每个.cpp文件分开)
  • 更好的优化机会 - 编译器将整个源代码视为一个整体,因此它可以跨合并的.cpp文件做出更好的优化决策(如果每个文件都是可能的单独编译)

我曾经使用的改善更大项目的编译时间 - 基本上创建多个(8)基本源文件,其中每个包括在cpp文件的一部分,然后被建立并联。完全重建后,该项目的建造速度提高了约40%。

然而,如所提到的,当然原因单个文件的变化重建构成单元,其可以是连续的开发过程中的缺点的。