为什么我们要在C++;? 我刚刚开始学习C++,我发现函数通常是单独声明和定义的,例如: // Declaration void sayhi(std::string name); // Definition void sayhi(std::string name) { std::cout << "Hello, " << name; } //声明 void sayhi(标准::字符串名称); //定义 void sayhi(标准::字符串名称){ 头文件是一种方便的机制,可以从多个翻译单元访问变量声明和函数原型 #include <header> #包括

为什么我们要在C++;? 我刚刚开始学习C++,我发现函数通常是单独声明和定义的,例如: // Declaration void sayhi(std::string name); // Definition void sayhi(std::string name) { std::cout << "Hello, " << name; } //声明 void sayhi(标准::字符串名称); //定义 void sayhi(标准::字符串名称){ 头文件是一种方便的机制,可以从多个翻译单元访问变量声明和函数原型 #include <header> #包括,c++,function,declaration,definition,one-definition-rule,C++,Function,Declaration,Definition,One Definition Rule,允许您在许多类中包含这些内容,从而使代码更加可重用 我们为什么要把它们分开 我们没有。 只要我们能摆脱它,至少,因为它违反了,引入(仅部分检查)重复 问题是C来自一个长线的单遍编译器,而C++用模板和返回类型演绎来处理很多事情,但是它并没有完全逆转这个事实。 因此,如果您想在函数定义之前使用它,就必须提供一个前向声明 如果您希望对部分代码使用单独编译,通常建议缩短编译时间,并能够在其他语言中使用库(静态或非静态),无需源代码,或使用其他选项编译,那么您需要某种方法告诉编译器将有什么 头文件是此类

允许您在许多类中包含这些内容,从而使代码更加可重用

我们为什么要把它们分开

我们没有。
只要我们能摆脱它,至少,因为它违反了,引入(仅部分检查)重复

问题是C来自一个长线的单遍编译器,而C++用模板和返回类型演绎来处理很多事情,但是它并没有完全逆转这个事实。 因此,如果您想在函数定义之前使用它,就必须提供一个前向声明

如果您希望对部分代码使用单独编译,通常建议缩短编译时间,并能够在其他语言中使用库(静态或非静态),无需源代码,或使用其他选项编译,那么您需要某种方法告诉编译器将有什么

头文件是此类转发声明、常量声明、内联函数(必须在使用它们的每个翻译单元中定义内联函数)、类型定义等的集合。
一般来说,实现文件首先包括相应的hesders,以验证它们是否工作并且是自包含的


无可否认,C++20引入的模块系统是一个新的转折点,它进一步减少了向前声明的需要。

相同的函数可以在不同的编译单元中使用

#include <header> 
如果它将在头中定义,并且它不是内联函数或具有内部链接的函数,那么如果头包含在多个编译单元中,那么一个定义规则(ODR)将被打破

#include <header> 
因此,通常这类函数在头中声明,但在某些模块中定义。因此,使用头,不同的编译单元将看到函数声明,并且函数只定义一次


如果一个程序只由一个编译单元组成,那么就没有必要单独声明和定义一个函数,因为函数定义同时也是它的声明。

在没有声明和定义分离的头文件中可以实现所有内容。我相信这个答案并不能回答这个问题你的意思是什么?他问为什么它们是分开的,我相信这回答了这个问题。如果你想补充Morpheus的答案,最上面的答案的要点对函数和类都是有效的。你的答案谈到了将代码分离到可以包含的头文件。这与声明和de的分离无关定义,例如
.hpp
.cpp
文件。正如我所说的-可以将一些代码移动到头文件(如您在回答中所说)仍然没有将声明和定义分开,这似乎是问题的本质。这很有帮助。我确实需要更多的经验来充分理解您的解释,但我感谢您的推荐。谢谢。为了澄清…我们通常不会将函数声明和定义分开,因为这会使脚本冗长,除非程序是WIP,因为它仍处于开发阶段???@NaderBelal,只要它不是必需的,将声明与定义分离只是开销。WIP与此无关。什么时候可能有必要???@NaderBelal相互递归和头文件。感谢您的时间评论。我需要更多的经验来理解所有这些s、 尽管如此,我还是非常感谢您的时间和帮助。在最初使用C语言的古代计算机上,这是必要的。在新的编程语言中,这是没有理由的。