问题描述
在 Python 中,当您创建一个模块时,您会创建一个 __init__.py
文件(至少通常如此)。是否有 C/C++ 等价物?我的意思是有没有办法#include
一个目录实际上包含一个文件?
解决方法
不,C++ 本身没有这样的特性。通常使用的编译器似乎也不支持它。 C++20 中引入了一个类似于 Python 模块的功能:https://en.cppreference.com/w/cpp/language/modules
您可能想查看像 SCons 或 CMake 这样的构建系统,它们允许您在实际的 C++ 预处理/编译之前实现一些预处理。例如,您可以使用它们生成一个包含目录中所有标题的头文件,或者如果您确实需要它,可以做任何更复杂的事情。
请注意最后一句话的最后一部分:您真的需要它吗?如果所有依赖项都是显式的,那么代码通常更容易维护。包含“所有内容”的标题将使其难以跟踪。当然,人们可以想象打破这一规则的一些正当理由,例如如果也生成了这些标题,并且希望有一种包含所有这些标题的自动方式。不过,最好是这种“魔法”的范围是独立的并且尽可能小。
,是否有 C/C++ 等价物?
不等价,但对于只有头文件的库,通常的做法是包含一个聚合头文件,这是一个头文件而不是包含其他头文件。例如,如果我们查看 boost filesystem:
/mnt/e/Repository/filesystem/include/boost/
├── filesystem
│ ├── config.hpp
│ ├── convenience.hpp
│ ├── detail/
│ ├── directory.hpp
│ ├── exception.hpp
│ ├── file_status.hpp
│ ├── fstream.hpp
│ ├── operations.hpp
│ ├── path.hpp
│ ├── path_traits.hpp
│ └── string_file.hpp
└── filesystem.hpp **Aggregate header**
filesystem.hpp 的内容:
...
# include <boost/filesystem/config.hpp>
# include <boost/filesystem/path.hpp>
# include <boost/filesystem/exception.hpp>
# include <boost/filesystem/directory.hpp>
# include <boost/filesystem/operations.hpp>
# include <boost/filesystem/file_status.hpp>
# include <boost/filesystem/convenience.hpp>
# include <boost/filesystem/string_file.hpp>
...
请注意,这与 __init__.py
文件的行为不同,它是一个方便的功能。您只需包含聚合标头即可访问所有功能。