2013-10-03 19 views
3

我之前遇到過問題,因爲函數過載而沒有std::。而且詛咒現在還在發生,因爲我不使用using namespace std;使用cmath時禁用math.h垃圾

Removing using namespace std causes the program to get crap results

有沒有一種方法來禁用來自c和僅與空間std下的C++函數工作的所有那些NON-STD功能(無需使用using namespace std;)?

換句話說:如果我使用sin()而不是std :: sin(),那麼我就不會犯這個錯誤。當然,不僅是罪,而且每一個與math.h有衝突的功能。

謝謝。

+0

如果你省略'math.h'並且在沒有'std ::'的情況下使用'sin',你不會得到一個錯誤嗎? – cnicutar

+1

爲什麼不用'std ::'預先加入? –

+1

@cnicutar:問題是''和朋友可能(或可能不)將部分或全部函數轉儲到全局名稱空間中。鏈接問題中的「垃圾」來自意外地調用「:: abs(int)」而不是「std :: abs(double)」。 –

回答

8

不幸的是,沒有辦法做到這一點。規則是#include <math.h>將所有名稱放入全局名稱空間,並且也允許將它們放入std::。同樣,#include <cmath>將所有名稱放入std::,並允許將它們放入全局名稱空間。允許無關命名空間的原因很簡單,純粹的版本通常無法對現有庫進行大手術,而這些庫甚至可能不在C++編譯器人員的控制之下。

6

將math.h中的所有函數聲明收集到namespace neveruse中,並說using namespace neveruse。現在所有對不合格sin的引用都是不明確的。

+0

難道這不會...像標準庫一樣亂七八糟嗎?我怎麼知道這是否會影響其他地方的別的東西? –

+1

您可以在自己的名稱空間中聲明任何函數。沒有任何衝突。它可以影響東西的唯一方法是通過生成編譯錯誤。 –