2016-02-11 57 views
1

我在我的代碼中使用std(using namespace std)(我知道它不太好&應該避免)然後我想知道哪些名稱可用用於變量或函數,並已被佔用,所以我搜索了std變量列表&函數,但我沒有找到它。如何檢查std中是否存在變量或函數?(在C++中)

PS。我的代碼實際上是作業,所以沒有擴大的夢想,也因此它是一項功課我期望使用std(:|)(即使我不是我只是好奇的答案)。所以我的問題是什麼是現有的 funcs 現在

+3

在標準命名空間中使用標準東西的目的是讓你沒有擔心它。如果你不像'use namespace std;'那樣做愚蠢的事情,你不必擔心它。 –

+1

你錯在認爲你應該這樣做。 – SergeyA

+0

@SergeyA不,不,我向你保證這不是一個錯誤,即使它是我只是好奇它。 – Bat

回答

7

std內部沒有確切的名稱列表 - 它始終可以擴展,並且完全是爲此目的而創建的。因此,一勞永逸地停止命名空間using

換句話說,C++標準規定了什麼名字在那裏,但絕不會限制設置爲那些規定的總體名稱。實現通常會將很多其他幫助函數或類別放入此名稱空間中。

+0

我的代碼實際上是一個家庭作業,所以沒有擴大的夢想,也因此它是一個家庭作業,我有點期待使用std(:|)。所以我的問題是現在在std中存在的變量和funcs是什麼。 – Bat

+0

實際上真的可以將非標準庫名稱放在'std'中(除了以'_'或'__開頭的那些?) – juanchopanza

+0

@Bat,不需要你這樣做。 – SergeyA

1

正如其他人建議的,停止using namespace std - 這是不好的的做法。

我也建議你停止using任何命名空間。通過這種方式,你的代碼讀得更好,避免了影響事件和命名衝突,最重要的是,你總是負責你的代碼庫:你知道你使用的東西來自哪裏,以及它們更廣泛的範圍/目的可能是什麼。這可以使您的代碼更易於維護:例如,更容易查看哪些頭未使用。什麼樣的功能只是輔助/內部等

這主要是一個品味的問題,但我會進一步建議你自己使用命名空間或詳細的描述性名稱(至少對於那些沒有範圍很小)。所有當代IDE都提供自動完成功能,因此您甚至不必再輸入一遍。在我的代碼我使用的東西,如:

bool has_the_loader_finished; 
bool should_the_program_quit; 
void helper::setup::setup_animation(); 

所有的時間。這樣一個。我的代碼中並不需要太多評論,大部分內容都是不言自明的,因此我只爲特殊的事情和b提供意見。我敢肯定,不會有名字衝突和c。我沒有花時間去調試/重構代碼,我已經不記得是什麼東西,如

int i; 
bool flag; 
void setup(); 

立場..

當然也有情況using是直觀的,如:

using std::placeholders 
ExampleFunction f = std::bind(&Object::hello, &instance,_1); // instead of std::placeholders::_1 

using namespace std::chrono_literals; 
auto halfmin = 30s; //instead of std::chrono_literals::30s 

using ms = std::chrono::milliseconds; // this is an alias basically 

不過,好的做法是永遠是a。限制使用您計劃使用的特定事物,例如:using std::placeholders而不是using std b。使用別名或typedefs和c。 儘可能限制using(和typedefs /別名)的範圍,例如

int someFunction() { 
    using namespace std; 
    // no more than a 20-30 lines of code here 
} 

// someSmallFile.cpp 
using namespace std; // this is valid in the body of this file only 

最後,從來沒有在頭文件使用using namespace。這將會把這個命名空間的內部暴露給包含該文件的所有翻譯單元,並且沒有你的客戶必然知道它...

+0

這是一些非常好的建議 – rlam12

相關問題