C++的模块概念

Gio*_*gio 7 c++ c++11

C++仍然是一种不断发展的语言,多年来一直在为它添加新功能.

我在C++中非常想念的一个特性是一个合适的模块概念:使用头文件的当前方法(使用条件#define来确保头文件不包括两次)对我来说似乎绝对不能令人满意.

例如,在我的项目中,我们遇到的问题是我们在许多源文件中有太多"#include",使得编译时间不必要很长:使用Incredibuild构建我们的产品需要45分钟,即使用至少10个核心并行.因此,我们必须花费大量时间手动清理文件,即删除包含以检查它们是否真的需要.

我认为拥有一个可以实现的模块概念是非常有用的

  1. 清楚地将界面与模块的实现分开;
  2. 单独编译接口和模块的主体(当前.h文件每次被包含在其他文件中时反复编译):工具可以读取编译的接口并告诉它导出的类型,函数和类;
  3. 编写用于更轻松地自动重新排列导入的工具(例如,使用Java/Eclipse,可以自动重新排列文件的所有导入).

您是否认为可以定义这样的模块概念并将其集成到C++中,还是太复杂?你知道朝这个方向做出的任何努力吗?

编辑

感谢有关预编译头文件的建议.如果可能,我会尝试一下(我们使用Visual Studio 2008).也许我们以错误的方式使用头文件(?)我们为每个类使用一个头文件.然后我们有一个带有类实现的cpp文件.通常我们最终得到包含30,40个头文件的cpp文件.当我们更改cpp文件时,不再需要某些包含,但很难找出哪些包含.这部分与头文件包含其他头文件的事实有关.

我们花了太多时间重新安排导入,似乎没有一个工具可以自动执行此操作.这会节省我们很多时间.

In *_*ico 10

C++仍然是一种不断发展的语言,并且作为C++ 0x开发的一部分,新功能正在被添加到它中.

C++ 11标准已经被批准发布,因此不再添加任何功能.至少再过几年.

我在C++中非常想念的一个特性是一个合适的模块概念:使用头文件的当前方法(使用条件 #define来确保头文件不包括两次)对我来说似乎绝对不能令人满意.

一些编译器支持#pragma once避免编写包含保护,但据我所知它是非标准的.有些情况下你想要包括警卫; Boost.Preprocessor是一个库的示例,其中包含一些故意没有包含保护的头文件.

例如,在我的项目中,我们遇到的问题是我们在许多源文件中有太多"#include",使得编译时间不必要很长:使用Incredibuild构建我们的产品需要45分钟,即使用至少10个核心并行.因此,我们必须花费大量时间手动清理文件,即删除包含以检查它们是否真的需要.

Stroustrup有关于编译时间缓慢的FAQ条目.另请阅读关于包含头文件的GotW文章#7.你很可能包含的文件多于必要的文件.例如,您可以通过前向声明来逃避.如果您有大量的头文件,您可以尝试将它们拆分,以便您的源只包含您真正需要的声明.这可能只是您的文件结构不利于快速编译的问题.

1.明确分离模块实现的界面;

我们有PIMPL习惯用法(也称为编译防火墙).即使没有它,我也没有任何麻烦将实现放在.cpp文件和文件中的接口.h(即使它不是"纯"接口).

2.单独编译模块的接口和主体(当前.h文件每次被包含在其他文件中时反复编译):然后工具可以读取编译的接口并告诉它导出的类型,函数和类;

某些编译器支持您可以利用的预编译头文件.

3.write工具,可以更轻松地自动重新排列导入.

我不明白你的意思.

您是否认为可以定义这样的模块概念并将其集成到C++中,还是太复杂?你知道朝这个方向做出的任何努力吗?

信不信由你,有人建议在C++中添加某种模块概念,但是由于时间限制,它还没有被C++ 11所接受(他们正在研究其他提议,比如rvalue引用,在我的意见,更重要).它可能包含在C++标准的下一个版本或更新中.

  • 我肯定会给预编译头文件一个镜头.如果你有一个正常的增量构建系统(而不是整个夜间构建),那么长头包含是编译时间的很大一部分,并且PCH可以*真正地降低它. (2认同)