【问题标题】:VC++ 2005 project option to include stl?VC++ 2005 项目选项是否包含 stl?
【发布时间】:2009-04-24 21:41:27
【问题描述】:

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

#include <cstdlib>
using namespace std;

是否有 VS2005 选项可以自动设置?解决这个问题有点乏味。我只是想在源代码中避免大量#ifdefs -

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

还有 - “std::map” 比“using namespace std; map” 更受欢迎?

【问题讨论】:

  • 你还在用什么其他编译器?

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


【解决方案1】:

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

不过,我并不是说应该始终需要这两行。我的意思是,如果您编写的其余代码使用 cstdlib 标头和 std 命名空间中声明的内容,那么这两行 需要 首先出现,并且编译器不应该表现得好像它们确实不存在。

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

【讨论】:

    【解决方案2】:

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

    执行全局“使用命名空间标准”通常是个坏主意。

    或者我没有理解这个问题。

    【讨论】:

      【解决方案3】:

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

      如果您查看 IAR 的运行时标头,您会发现他们做了一些宏操作来解决这个问题(运行时从 Dinkumware 获得许可,它为很多编译器提供运行时)。

      如果你想让你的东西在多种环境中工作,你可能需要做类似的事情。一个可能的更简洁的替代方法是只包含“using namespace std;”指令。我可能错了,但我认为 IAR 编译器基本上忽略了它(它不介意您使用的是它不知道的命名空间)。很多人会认为这很丑陋,但有时你必须按照编译器的要求去做。

      【讨论】:

        【解决方案4】:

        一般来说,你应该避免“使用命名空间 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) { ... };
        

        等等。这样您就可以避免影响其他人,包括您的标题,并且避免引入可能导致与其他内容冲突的数以千计的名称。

        【讨论】:

          猜你喜欢
          • 2010-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多