假設您在翻譯單元內定義了一個函數名,該函數的名稱與任何標準庫函數完全匹配。 由於編譯器首先在翻譯單元中查找定義,然後在庫文件中查找,那麼這個原因也會使用自己的函數定義版本還是會導致診斷?C++是否也保留標準庫函數名稱?
回答
不,不會保留名稱空間std
中的函數名稱 - 至少不能在名稱空間std
以外使用相同名稱的意義上被禁止。
但是,在名稱空間std
(除少數情況下,例如專門化某些模板函數外)中放置名稱會導致未定義的行爲。
如果編譯器在調用函數時抱怨模糊不清,其中一個函數與您的函數具有相同的名稱,但位於名稱空間std
中,則原因可能是代碼中的using namespace std
。其結果是,當編譯器遇到一個名稱時,您的函數和命名空間std
中的函數都是有效的匹配項。如果編譯器沒有理由相對於另一個(例如它們接受相同類型的參數),則代碼將不會編譯。在這種情況下,解決方案是從您的代碼中刪除using namespace std
- 除了刪除它之外,無法撤消using namespace std
的影響。
我不知道我是否正確(糾正我,如果我錯了)明白的問題,但是說你有一個功能,像這樣:
void sort(// blah blah
或者宣告空間std using namespace std
(which you should not be doing)
當您在翻譯單元中調用sort(...)
時,編譯器將重載定義,在這種情況下,您的函數具有優先權。
但如果要調用通過顯式定義std命名空間(使用範圍解析運算符)的標準庫函數,像這樣
std::sort(// blah blah
它將使用std庫函數來代替。
@HolyBlackCat我不知道爲什麼'putchar'有這種行爲,但對我來說你的代碼不應該工作,請參閱http://ideone.com/EXJ50I。 – Holt
標準庫沒有特別的優先權。如果'std'中的'sort'被'using namespace std'拉入,並且還有一個用戶定義的函數'sort',則通常的重載規則適用。 –
@ialcuaz - 不,那是不對的。編譯器在調用時處理重載,並查看範圍內的所有聲明。他們如何到達那裏並不重要。 –
這就是爲什麼人們說在C++中使用using namespace std;
是不好的做法。
因爲當您使用已在namespace std
內定義的相同函數名稱導致許多不相關的錯誤時,函數定義會發生衝突。
閱讀此線程的詳細信息: -
Why using namespace std; in C++ is considered a bad practice?
- 1. t_無論C標準還是POSIX中的保留名稱?
- 2. 是否爲MovieClip名稱保留「_」前綴?
- 3. C標準庫函數檢查char *是否是一個單詞?
- 4. C++保留字作爲C中的函數指針名稱struct
- 5. 此操作是否有標準名稱?
- 6. 「html」不是保留名稱
- 7. 「login.ini」是保留名稱嗎?
- 8. 名稱與標準庫
- 9. c標準庫中是否有驗證函數?
- 10. 保留列或表名稱的標準修改
- 11. *是C++函數名稱?
- 12. 是否在名稱空間std下聲明瞭C++標準庫中的每個類,對象和函數?
- 13. H2數據庫列名稱「GROUP」是保留字
- 14. C++標準庫是否可以替換?
- 15. foreach:保留名稱
- 16. ISO標準命名是否有標準?
- 17. 是否有「數字」的標準簡稱?
- 18. 數據準備在R:正長行堆疊列保留名稱
- 19. 是否可以更改保留工作區的匿名函數?
- 20. 與fgets C標準庫函數
- 21. C++標準要求C連接函數是否爲「noexcept」?
- 22. Firebase Analytics:保留標準
- 23. C++中是否有64位整數的「標準」htonl函數?
- 24. 'INDEX'是否有效SQL ANSI ISO標準關鍵字/保留字?
- 25. 是否可以在Google App Engine中保留標準化模型?
- 26. 在Rails中,「名稱」是保留字嗎?
- 27. 保存數據庫標準
- 28. 標準庫implmentation源,沒有名稱uglified
- 29. c標準是否保證對簽名和未簽名的位模式解釋?
- 30. 是否存在用於JQuery選擇器的保留名稱?
這聽起來像使用'使用命名空間std的症狀;'。如果你正在使用[請停止](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-in-c-considered-bad-practice)。 – NathanOliver
如果您使用自己的名稱空間,則可以重用stl函數名稱。例如'mynamespace {ostream&cout(String str)...}'。然後,您可以使用範圍解析運算符(:)使用您的名稱空間來指定您想要使用哪種cout – pjcognetta
「正好匹配」,就像在「std」名稱空間中引入新符號一樣?這在第17.6.4.2.1節中明確禁止:*「如果程序的行爲是將聲明或定義添加到命名空間'std'」*,則該行爲是未定義的。但是,您可以針對用戶類型專門設計模板。 – peppe