繁体   English   中英

C++ #include<XXX.h> 相当于 Python 的 import XXX as X

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

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

我发现 Python 的 import XXX as X 通过以下方式非常简洁,例如:

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

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

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

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

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

所以我想知道是否有办法在 C++ 中像 Python 中的import XXX as X方式那样做?

不。

如果您编写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 的 import XXX as X

C++ 中没有等价物。

当您将一个文件包含到另一个文件中时,您将获得包含文件中的每一个声明,并且您无法更改它们的名称。

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

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

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

我喜欢做的是记录哪个标题提供了使用的声明:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM