我通常建议不要(仅)使用 IDE 或语言语法来组织源代码。一方面,您将自己与环境联系在一起:在 IDE 中组织良好,文件无组织,然后有一天您可能想要使用不同的环境......
正因为如此,我通常同时使用这三种方式来组织我的源代码:我将我的源代码分成功能模块,即相关的类。每个模块都有自己的命名空间、物理文件夹和 IDE 文件夹。(在我的情况下,如果需要,使用CMake并source_group()
生成 IDE 项目文件——个人更喜欢命令行、Vim 和“make”。)
因此,无论我是从 IDE、命令行还是编译器日志中查看项目,foo/some_class.hpp 是 foo/some_class.cpp 是 foo::some_class,从而最大限度地减少混乱。
实际上,我目前首选的设置将每个模块目录进一步细分为<project>/<module>/<class>.hpp
或<project>/<module>/src/<class>.hpp
取决于该类是否在其自己的模块之外使用<project>/<module>/src/<class>.cpp
,和<project>/<module>/test/<class>_tu.cpp
. 命名空间<project>::<module>::<class>
当然是 。
project
|-- foo
| |-- some_class.hpp
| |-- src
| | |-- internal_class.hpp
| | |-- internal_class.cpp
| | `-- some_class.cpp
| `-- test
| |-- internal_class_tu.cpp
| `-- some_class_tu.cpp
|-- bar
| |-- ...
这里的想法是每个模块(foo
)的“外部”接口由该子文件夹中的标题记录,实现细节和测试“隐藏”在相应的子文件夹中。
但最终,这在很大程度上取决于——你的品味、你的合作开发者的品味以及你的项目范围。