jsh*_*hji 7 c++ declaration function definition one-definition-rule
我才刚刚开始学习C ++,我看到函数通常是分别声明和定义的,例如:
// Declaration
void sayhi(std::string name);
// Definition
void sayhi(std::string name) {
std::cout << "Hello, " << name;
}
Run Code Online (Sandbox Code Playgroud)
我尝试查找,但是大多数问题是针对Class的情况,但是我的问题是从更笼统的角度来讲,为什么我们将它们分开?有什么好处?
可以在不同的编译单元中使用相同的功能。
如果将在标头中定义它,而不是内联函数或具有内部链接的函数,则只要标头包含在多个编译单元中,一个定义规则(ODR)将被破坏。
因此,通常这些函数在标头中声明,但在某些模块中定义。因此,使用标头,不同的编译单元将看到函数声明,并且函数将仅定义一次。
如果程序仅由一个编译单元组成,则无需分别声明和定义函数,因为函数定义同时是其声明。
我们为什么要分开?
我们没有。
只要我们至少可以克服它,因为它违反了DRY,就会引入(仅部分检查)重复。
问题在于C来自一长串的单遍编译器,尽管C ++用模板和return-type-deduction进行了大量工作,但它并没有完全扭转这一事实。
因此,如果要在定义函数之前使用函数,则必须提供前向声明。
并且,如果您希望对代码的各个部分使用单独的编译,通常建议这样做是为了缩短编译时间,并能够使用其他语言的库(静态或非静态),而无需提供源代码或使用其他选项进行编译,则需要某种方式告诉编译器将会有什么。
头文件是这些前向声明,常量声明,内联函数(必须在每个使用它们的翻译单元中定义内联函数),类型定义等的集合。
通常,实现文件首先包含相应的hesder,以验证其是否有效并且是独立的。
诚然,C ++ 20引入的模块系统是一种新的变化,并进一步减少了对前向声明的需求。
小智 2
头文件是一种从多个翻译单元访问变量和函数原型声明的便捷机制。
#include <header>
Run Code Online (Sandbox Code Playgroud)
让您可以将它们包含在许多类中。从而使代码更具可重用性。
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |