c++ - C++中声明和定义分开的优点和缺点是什么?

标签 c++ language-design declaration definition

在C++中,函数、变量和常量的声明和定义可以这样分开:

function someFunc();

function someFunc()
{
  //Implementation.
}

其实在类的定义中,经常会出现这种情况。类通常在 .h 文件中声明它的成员,然后在相应的 .C 文件中定义这些成员。

这种方法的优点和缺点是什么?

最佳答案

从历史上看,这是为了帮助编译器。在它使用名称之前,您必须给它一个名称列表 - 无论这是实际用法,还是前向声明(C 的默认函数原型(prototype)除外)。

现代语言的现代编译器表明这不再是必需的,因此 C 和 C++(以及 Objective-C,可能还有其他)的语法在这里是历史包袱。事实上,这是 C++ 的一大问题,即使添加适当的模块系统也无法解决。

缺点是:许多严重嵌套的包含文件(我之前跟踪过包含树,它们非常大)和声明和定义之间的冗余 - 所有这些都会导致更长的编码时间和更长的编译时间(曾经比较过之间的编译时间)可比较的 C++ 和 C# 项目?这是造成差异的原因之一)。必须为您提供的任何组件的用户提供头文件。 ODR 违规的可能性。依赖预处理器(许多现代语言不需要预处理器步骤),这会使您的代码更脆弱,更难被工具解析。

优点:不多。您可能会争辩说,为了文档的目的,您得到了一个函数名称列表,这些函数名称被组合在一个地方——但是现在大多数 IDE 都具有某种代码折叠功能,无论如何,任何规模的项目都应该使用文档生成器(例如 doxygen)。使用更简洁、无预处理器、基于模块的语法,工具可以更轻松地遵循您的代码并提供此功能以及更多功能,因此我认为这种“优势”几乎没有实际意义。

关于c++ - C++中声明和定义分开的优点和缺点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/645778/

相关文章:

c++ - 如何以编程方式查找动态库文件的位置?

c++ - g++ 使用共享库时出现 undefined symbol 错误

c++ - 为什么隐式复制构造函数调用基类复制构造函数而定义的复制构造函数不调用?

c++ - IContextMenu3 HandleMenuMsg2 从未被调用

c++ - 如何推断模板中的 C++ 返回类型?

c++ - 为什么 C/C++ 字符串文字声明必须是单行的?

ruby - ruby解释器如何解析双引号字符串

c# - 如果私有(private)变量已经是私有(private)的,我应该将它们标记为私有(private)的是什么?

r - R 中参数长度为零的声明

c - C 中的声明或定义