我才刚刚开始学习C++,我看到函数通常是单独声明和定义的,例如:
// Declaration
void sayhi(std::string name);
// Definition
void sayhi(std::string name) {
std::cout << "Hello, " << name;
}
我试着查找,但大多数问题都是针对 Class 的情况,但我的问题更笼统,为什么我们要将它们分开?有什么好处?
同一函数可以在不同的编译单元中使用。
如果它将在标头中定义,并且它不是内联函数或具有内部链接的函数,则只要标头包含在多个编译单元中,则一个定义规则 (ODR( 将被破坏。
因此,通常此类函数在标头中声明,但在某些模块中定义。因此,使用标头时,不同的编译单元将看到函数声明,并且函数将仅定义一次。
如果一个程序只包含一个编译单元,那么就没有必要单独声明和定义一个函数,因为函数定义同时是它的声明。
为什么要将它们分开?
我们没有。
只要我们至少可以侥幸逃脱,因为它违反了 DRY,引入了(仅部分检查(重复。
问题在于 C 来自一长串的单通道编译器,虽然C++用模板和返回类型推导来固定很多东西,但它并没有完全扭转这一事实。
因此,如果要在定义函数之前使用函数,则必须提供前向声明。
如果你想对代码的某些部分使用单独的编译,这通常是建议的,以便缩短编译时间,并且能够使用其他语言的库(静态或非静态(,没有源代码,或者使用其他选项编译,你需要一些方法来告诉编译器将有什么。
头文件是此类前向声明、常量声明、内联函数(内联函数必须在使用它们的每个翻译单元中定义(、类型定义等的集合。
通常,实现文件首先包含相应的 hesder,以验证它们是否有效且自包含。
诚然,C++20引入的模块系统是一个新的转折,进一步减少了对前瞻申报的需求。
头文件是一种方便的机制,用于从多个翻译单元访问变量和函数原型的声明。
#include <header>
允许您将它们包含在许多类中。从而使代码更易于重用。