我正在开发一个使用STL的跨平台项目。其他编译器默认包含STL支持,但在VS2005中我需要在使用STL项的类定义之前添加以下内容:
#include <cstdlib>
using namespace std;
是否有自动设置的VS2005选项?解决这个问题有点单调乏味。我只是想在源代码中避免很多#ifdefs -
编辑:另一个编译器是ARM 926x系列的IAR工作台。也许我应该让他们明确地做包括?
另外 - 是“std :: map&lt;&gt;”优先于“using namespace std; map&lt;&gt;” ?
答案 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) { ... };
等。通过这种方式,您可以避免影响其他人(包括标题),并避免引入可能导致与其他内容冲突的数以万计的名称。