VC ++ 2005项目选项包括stl?

时间:2009-04-24 21:41:28

标签: visual-c++ visual-studio-2005 stl

我正在开发一个使用STL的跨平台项目。其他编译器默认包含STL支持,但在VS2005中我需要在使用STL项的类定义之前添加以下内容:

#include <cstdlib>
using namespace std;

是否有自动设置的VS2005选项?解决这个问题有点单调乏味。我只是想在源代码中避免很多#ifdefs -

编辑:另一个编译器是ARM​​ 926x系列的IAR工作台。也许我应该让他们明确地做包括?

另外 - 是“std :: map&lt;&gt;”优先于“using namespace std; map&lt;&gt;” ?

4 个答案:

答案 0 :(得分:2)

所有编译器都应该要求您包含这些行。如果他们不这样做,那么他们只是鼓励你编写不可移植的代码,因为你依赖于自动包含的某些标题,并且你依赖某些名称隐含在范围内。

我并不是说应该总是要求这两行。我的意思是,如果编写其余代码是为了使用 cstdlib 标头和std命名空间中声明的内容,那么这两行需要来首先出现,并且当编译器确实不存在时,编译器不应该像它们那样。

检查您的其他编译器是否有一些设置来禁用此隐式代码。如果没有,那么它可能是一个非常非常老的编译器,你应该考虑不使用它而不再支持它。

答案 1 :(得分:1)

尝试通过名称空间限定名称(即std :: vector)引用STL组件。

执行全局'使用命名空间std'通常是一个坏主意。

或者我可能不理解这个问题。

答案 2 :(得分:0)

IAR编译器不支持std命名空间(我不知道为什么,因为如果我没记错的话,它确实支持命名空间)。

如果你查看IAR的运行时头文件,你会看到他们做了一些宏体操来解决这个问题(运行时是从Dinkumware获得许可的,Dinkumware为很多编译器提供运行时)。

如果您希望自己的东西在多种环境中工作,您可能需要做类似的事情。可能更清晰的替代方案是仅包含“using namespace std;”指令。我可能错了,但我认为IAR编译器基本上忽略了它(它不介意你使用它不知道的命名空间)。很多人会认为这很难看,但有时候你必须做你想要的编译器。

答案 3 :(得分:0)

一般来说,你应该避免“使用命名空间X”,特别是在头文件中(因为包含你的头的每个人都会得到那个命名空间,无论他们是否需要它),特别是对于命名空间std(因为它太大而且潜力很大)名称冲突很大。)

相反,在头文件中,通过完全限定的形式引用名称,例如:

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

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

然后,在代码文件中,您可以执行“使用”,但更喜欢使用命名空间中的特定项而不是拉入整个命名空间。 e.g:

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

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

等。通过这种方式,您可以避免影响其他人(包括标题),并避免引入可能导致与其他内容冲突的数以万计的名称。