Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在cpp中放置什么以及在h文件中放置什么_C++ - Fatal编程技术网

C++ 在cpp中放置什么以及在h文件中放置什么

C++ 在cpp中放置什么以及在h文件中放置什么,c++,C++,可能重复: 通常在.cpp文件中定义的所有函数/方法都可以在.h文件中内联定义。那么使用.cpp的原因是什么呢?有效性?编译时间 是否有一些标准,例如哪些内容可以保存在.h中,哪些内容应该保存在.cpp中 多谢各位 减少编译时间。如果定义都在头文件中,则每次头文件更改时,都需要编译包含该头文件的所有文件。 对实现隐藏接口。允许发送标题和库。 有关 及 基本上,编译器能够编译所有文件,不管你把所有代码放在.h或.cpp文件中。把它们分开有根本的好处 简言之,为了可见性和可重用性,您希望将接口与实

可能重复:

通常在.cpp文件中定义的所有函数/方法都可以在.h文件中内联定义。那么使用.cpp的原因是什么呢?有效性?编译时间

是否有一些标准,例如哪些内容可以保存在.h中,哪些内容应该保存在.cpp中

多谢各位

减少编译时间。如果定义都在头文件中,则每次头文件更改时,都需要编译包含该头文件的所有文件。 对实现隐藏接口。允许发送标题和库。 有关

基本上,编译器能够编译所有文件,不管你把所有代码放在.h或.cpp文件中。把它们分开有根本的好处

简言之,为了可见性和可重用性,您希望将接口与实现分离。 它减少了编译时间 当您使用3dparty库的头文件时,您实际上并不关心它的实现,而是关心要调用的函数签名 当您将自己的库作为一个util库提供时,您只希望为要使用的用户提供头文件,而为希望开发您的库的用户提供源库 这个列表可以更进一步,但这就是我现在想到的
你不能把所有的东西都内联起来。对象可以定义一次,也只能定义一次。只有类和模板可以多次定义,内联只允许重新定义函数

例如,考虑页眉.HPP:

以下内容必须纳入专用的单一翻译单元:

#include "header.hpp"

int a;
int Foo::b;
另一方面,类模板的静态成员可以而且必须保留在标题中:

template <typename T> struct Foo { static int x; };
template <typename T> int Foo<T>::x;

链接器必须弄清楚如何对对象进行uniquify。

在cpp中定义函数会隐藏实现。此外,实现可能需要来自其他对象和类的服务。在header中添加这样的代码将依赖于使用所声明类的代码。有效性在您的句子中是什么意思?所有代码要么有效,要么无效,与文件的结构无关。例如:(C++中为什么有头文件和CPP文件?[Copy])[1 ] [1 ]:我一直在想相反的情况。如果所有类都是在.cpp文件中内联定义的,并且头文件中唯一的内容是纯虚拟类声明和一些工厂,会怎么样?这看起来怎么样?我想指出,全局变量是一个非常糟糕的问题idea@MoatazElmasry:记住下次使用std::cout时!well cout是在名称空间中定义的运算符函数,与extern int a不同。除此之外,std::只是一个已确立的概念,不能与用户定义的概念进行比较variables@MoatazElmasry:嗯,好吧…@MoatazElmasry:1,你错了。全面禁止globals将排除几乎所有的I/O设备,排除使用内存映射I/O,排除许多全局变量是最佳设计决策的事情。全球化不一定是邪恶的。他们会被滥用吗?当然。大多数用途可能是滥用。这并不意味着它们总是坏的,或者你总能找到替代品。2,你对环球拳王队的离题咆哮没有抓住Kerrek的重点。他的观点是你不能把所有的东西都放在头球上。有时源文件是绝对必要的。这也减少了需要重新编译的可能性。
template <typename T> struct Foo { static int x; };
template <typename T> int Foo<T>::x;