【问题标题】:Is there a C/C++ equivalent for Python's "__init__.py"? [duplicate]Python 的“__init__.py”是否有 C/C++ 等价物? [复制]
【发布时间】:2021-05-14 01:48:06
【问题描述】:

在 Python 中,当您创建一个模块时,您会创建一个 __init__.py 文件(至少,通常是这样)。这个东西有C/C++等价物吗?我的意思是有没有办法#include 一个实际上包含一个文件的目录?

【问题讨论】:

  • #include 的预处理器处理背后绝对没有逻辑。它真的只是一个副本/过去,就是这样。
  • @mkrieger1 我知道如何包含目录中的文件,您只需指定路径。我想知道的是如何自动化这个过程
  • 看看CMake,这是一种非常常见的项目管理方式。
  • @mkrieger1 我已经做过这件事了。我的项目中有一个文件,其中包含库的整个代码。但是我想通过#include "project"(或类似的东西)而不是#include "project/init.h" 来包含该文件(来自外部文件)

标签: python c++ c++11


【解决方案1】:

不,C++ 本身没有这样的特性。似乎通常使用的编译器也不支持它。在 C++20 中引入了一个类似于 Python 的模块的特性:https://en.cppreference.com/w/cpp/language/modules

您可能想查看SConsCMake 之类的构建系统,这将允许您在实际的C++ 预处理/编译之前实现一些预处理。例如,您可以使用它们来生成一个包含目录中所有头文件的头文件,或者如果您确实需要它,可以做任何更复杂的事情。

请务必考虑最后一句话的最后一部分:您真的需要它吗?如果代码的所有依赖项都是显式的,通常代码更容易维护。包含“所有内容”的标题将使其难以跟踪。可以想象一些打破这一规则的正当理由,例如如果这些标头也生成了,并且希望有一种包含所有这些标头的自动方式。不过,最好是这种“魔法”的范围是独立的并且尽可能小。

【讨论】:

  • 您好,感谢您的回答。比如说#include <any> 使用的方法是什么?这为std 添加了几个功能。
  • @Giuppox 这些函数要么在这个单独的包含文件 (any.h) 中定义,要么在 any.h 传递包含的头文件中定义。
  • @Giuppox 它在系统中查找名为any 的文件的包含路径(非递归),然后复制粘贴它找到的第一个文件的内容。在我的系统上是/usr/include/c++/7/any
  • 标准听众没有扩展名,因此#include <any> 查找名为any 的文件,而不是any.hany.hpp
【解决方案2】:

这个东西有 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 文件的行为不同,它是一个方便的功能。您只需包含聚合标头即可访问所有功能。

【讨论】:

  • FWIW,它的行为不一样,但这可能是最接近在 __init__.py 中定义 __all__ 数组的方法。
  • 是的,我确实试图强调这一事实。此外,您必须手动编写标头,从 python-dev 的角度来看,这可能是一个痛点。
猜你喜欢
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 2017-10-04
  • 2012-12-17
  • 1970-01-01
相关资源
最近更新 更多