《C++ Primer》第 82 頁提到 <cname>(如 <cmath>、<cstring>)頭文件屬於 std 命名空間,但許多編譯器允許不加 std:: 前綴直接調用 sin()、strlen() 等函數。原因有二:
std 命名空間符號自動進入全局作用域。<cname> 將符號放入 std,但允許實現同時也將其放入全局命名空間(C 風格)。GCC、MSVC、Clang 默認都這樣做,以支持舊 C 代碼遷移。雖然當前編譯器普遍支持無前綴調用,但標準不保證這一行為。為代碼可移植性、避免命名衝突,建議始終显式使用 std::sin、std::strlen 或在局部作用域 using std::sin;。