C++ #include<XXX.h>相当于 Python 导入的 XXX 作为 X

C++ #include<XXX.h> equivalent of Python's import XXX as X

本文关键字:XXX 导入 作为 Python #include lt C++ gt 相当于      更新时间:2023-10-16

我大部分时间都在使用Python,由于某些原因,现在我也需要使用C++。

我发现Python的导入XXX作为X非常整洁,例如:

import numpy as np
a = np.array([1,2,3])

通过查看我的代码,我非常清楚array()函数是由numpy模块提供的。

但是,在使用C++时,如果我这样做:

#include<cstdio>
std::remove(filename);

乍一看,我不清楚std命名空间下的remove()函数是由<cstdio>提供的。

所以我想知道是否有办法在 Python 中import XXX as X方式在C++中做到这一点?

不。

如果你写std::remove(无论如何你都应该这样做;不能保证该符号在全局命名空间中可用),它会稍微清楚一些,因为这样至少你会知道它来自标准标头。

除此之外,这取决于你的记忆。

有些人试图引入这样的黑客:

namespace SomeThing {
#include <cstdio>
}
// Now it's SomeThing::std::remove

这可能适用于您自己的标头(尽管即使那样我仍然不鼓励这样做)。但它肯定会导致标准标头的各种混乱,并且是不允许的:

[using.headers]/1:C++标准库中的实体在标头中定义,当翻译单元包含适当的#include预处理指令时,其内容可供翻译单元使用。

[using.headers]/3:翻译单元应仅在任何声明或定义之外包括标题,并且应在该翻译单元中首次引用该标题中声明的任何实体之前在词汇上包括标题。无需诊断。

回想一下,#includeimport是根本不同的东西。C++模块可能会在某种程度上实现这种功能,但是通过包含源代码,您甚至不会触及由该代码创建的符号命名空间。

不,没有办法强制使用这种语法。开发您包含的代码的人是免费的。通常,人们将他们的代码拆分为命名空间,这可能会导致以下语法:

#include <MyLibrary.h>
int main()
{
MyLibrary::SayHello();
return 0;
}

但是你无法保证标头中的代码是如何编写的。

C++#include<XXX.h>相当于Python的导入XXX作为X

C++中没有等价物。

当您将一个文件包含在另一个文件中时,您可以从包含的文件中获取每个声明,并且您无法选择更改其名称。

不过,您可以为类型和命名空间添加别名,以及对对象的引用,以及编写包装函数来执行 Python 中as X部分所做的一些操作。

乍一看我并不清楚 remove() 是由<cstdio>提供的。

std命名空间至少告诉您它是由标准库提供的。

我喜欢做的是文档,哪个标头提供使用的声明:

#include<cstdio>  // std::remove
std::remove(filename);

也就是说,大多数 IDE 可以通过按住 ctrl 单击或将鼠标悬停在标识符上来显示标识符的声明位置(尽管当不同标头中存在重载时,这并不总是有效)。我对包含注释的主要用途是检查重构后可以删除哪些包含。