[英]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:
翻譯單元應僅在任何聲明或定義之外包含標題,並且應在該翻譯單元中對在該標題中聲明的任何實體的第一次引用之前在詞法上包括標題。 不需要診斷。
回想一下, #include
和import
是根本不同的東西。 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.