2009-04-24 65 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) { ... }; 

等等。这样你避免影响其他人,包括你的头,你避免了数以亿计的潜在可能导致与其他的东西发生碰撞名称的拉动。