2009-04-24 108 views
1

我正在使用STL的跨平臺項目。其他編譯器默認包含STL支持,但在VS2005我需要使用STL項目的類定義之前添加以下內容:VC++ 2005項目選項包括stl?

#include <cstdlib> 
using namespace std; 

是否有將自動設置這個選項VS2005?解決問題只是有點繁瑣。我只是想在源代碼中避免大量的#ifdefs-

編輯:另一個編譯器是ARM​​ 926x系列的IAR工作臺。也許我應該讓他們明確做包括?

另外 - 是「std :: map <>」優先於「using namespace std; map <>」?

+0

你使用了什麼其他編譯器? – 2009-04-24 21:48:50

回答

0

IAR編譯器不支持std命名空間(我不確定爲什麼,因爲它確實支持通常的命名空間,如果我沒有記錯的話)。

如果你看看IAR的運行時頭文件,你會看到他們做了一些宏體操來解決這個問題(運行時是由Dinkumware授權的,它提供了很多編譯器的運行時)。

如果你想讓自己的東西在多種環境下工作,你可能需要做類似的事情。一種可能的更清潔替代方法是隻包含「using namespace std;」指令。我可能是錯的,但我認爲IAR編譯器本質上忽略了它(它並不介意你使用了一個它不知道的名稱空間)。很多人會認爲這很醜陋,但有時候你必須做你希望你做的編譯器。

1

嘗試通過名稱空間限定的名稱(即std :: vector)引用STL組件。

做一個全局'使用命名空間標準'通常是一個壞主意。

或者我可能不理解這個問題。

2

所有編譯器都應該要求您包含這些行。如果他們不這樣做,那麼他們只是鼓勵你編寫不可移植的代碼,因爲你依賴於某些頭文件被自動包含,並且你依靠特定的名字隱含地在範圍內。

我不是故意說那兩條線總是需要的,但是。我只是說,如果其餘代碼的寫入是爲了使用cstdlib標頭和std命名空間中聲明的東西,那麼這兩行需要先出現,並且編譯器不應該像它們那裏當他們真的不是。

檢查您的其他編譯器是否有一些設置來禁用此隱式代碼。如果沒有,那麼它可能是一個非常非常老的編譯器,你應該考慮不使用它,不再支持它。

0

一般來說,你應該避免使用namespace X,特別是在頭文件中(因爲包括頭文件的每個人都會得到這個名字空間,無論他們是否需要它),特別是對於命名空間std(因爲它太大了,名稱衝突的可能性很大)。

取而代之的是,在頭文件中,用完全限定的形式引用名稱,例如,:

// for plain functions 
void foo(std::map<int> intMap); 

// for classes 
class person { 
    std::string name_; 
    public: 
    person(std::string name); 
    // ... 
}; 

然後,在代碼文件,你可以做的「使用」,但更喜歡使用命名空間中的特定項目,而不是整個命名空間拉。例如: -

using std::map; 
using std::string; 

void foo(map<int> intMap) { ... }; 
person::person(string name) : name_(name) { ... }; 

等等。這樣你避免影響其他人,包括你的頭,你避免了數以億計的潛在可能導致與其他的東西發生碰撞名稱的拉動。