2015-05-17 55 views
10

我有一個簡單的電話std::setenv,這在我的Linux發行版中工作正常,在gcc下。但是,在我的Mac OS X上使用clang時,出現以下錯誤。C++標準庫 - std :: setenv vs setenv

error: no member named 'setenv' in namespace 'std'; did you mean simply 'setenv'? 
std::setenv(name.c_str(), value.c_str(), true); 

我敢肯定,我讀過某處setenv是C++ 11的命名空間std的一部分,但現在我不能確定。

問題:應該使用setenv還是std::setenv,爲什麼會出現這種情況?

回答

12

我不find類似的東西std::setenvcppr,只有std::getenv它的文檔中引用了POSIX功能setenv,這當然是namespace std

因此,由於您不是在調用C++標準函數,因此應該採用簡單的方式,因爲這是定義函數的標準定義它的方式。請注意,std::setenv被允許(但不是必需)工作。 (也hvd's comment見。)

對於標準的愛好者:setenv僅作爲

調用該函數getenv不得采取(17.6.5.9)提供的數據競爭中提到,沒有什麼修改 環境。 [注意:調用POSIX函數setenvputenv修改環境。 - 結束 注]

from N3797 18.10.5。它確實不是一個C++標準函數,因此不一定在namespace std

+1

C++標準沒有定義'setenv',所以如果實現將它定義爲擴展,它們可以使用全局命名空間,'std'命名空間或任何其他命名空間,但是它們看起來合適。在'std'命名空間中聲明它的OP的實現與OP的其他實現不一樣有效。 (爲了澄清:我確實同意簡單的'setenv'是OP應該使用的東西,但是你的回答就好像「std :: setenv」工作的事實是一個錯誤。) – hvd

+0

@hvd但是缺少進一步的文檔除了POSIX之外,我不知道也沒有找到任何'setenv'),我假設他在談論POSIX,並且想知道它是否也是標準的C++函數。由於POSIX函數不在'namespace std'中,全局調用將是訪問它的一般方法。雖然一些像linux上的gcc這樣的平臺將它添加到'namespace std'中,但定義它的標準卻沒有。我錯了嗎? –

+0

@hvd還要注意,我從來沒有說過'std :: setenv'不允許工作,只是不能保證。 –