为什么用g ++编译特定的c ++源文件会在PC和Mac上产生不同的结果?

时间:2013-10-22 17:14:23

标签: c++ macos c++11 makefile

我已经在PC上编译并链接了一些带有make的c ++源文件,没有错误。然后我使用相同的sourecefiles和相同的makefile并在Mac上尝试它,但有6个错误。编译器应该是相同的,并以相同的方式解释文件,但显然不是?是不是在Mac上使用的LLVM-g ++与PC上的g ++不同?

所有错误都有此路径:/usr/include/c++/4.2.1/bits/stl_iterator_base_types.h

Mac上的g ++版本4.6.1(PC)和Apple LLVM版本5.0(clang-500.2.76)(基于LLVM 3.3svn)

一个错误是:

usr/include/c++/4.2.1/bits/stl_iterator_base_types.h:129:35: error: no type
  named 'value_type' in 'std::pair<int, int>'
  typedef typename _Iterator::value_type        value_type;
          ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~

1 个答案:

答案 0 :(得分:2)

使用相同的源代码和makefile不一定会在不同的平台上产生相同的行为。以下是一些可能导致差异的事情:

  • makefile可以做特定于平台的事情。
  • 源代码可以使用预处理器来区分平台。
  • 编译器和编译器版本可能以不同方式对源进行内插
    • 可能支持不同的功能和扩展
    • 可能有不同的错误
    • 可能需要不同的参数
  • 平台库可能有所不同。
    • 平台特定库将无法在其他平台上使用
    • 不同的标准库实现可能有不同的扩展/错误。
    • 不同的标准库实现可能针对不同的规范版本(例如,C ++ 03与C ++ 11库)。
    • 以导致未定义或实现定义的行为的方式使用库可能会在不同的实现之间产生不同的结果。
    • '可移植'但不是标准化的库可能会有所不同(例如,char *char const *
    • 的功能

从您发布的错误“错误:'std :: pair'中没有名为'value_type'的类型”我猜你正在错误地使用标准库并且你正在使用的标准库实现之一让你逃脱了,但另一个却没有。

似乎在您的代码中的某个时刻,您正在使用不符合要求的模板参数来实例化模板,因此在模板实例化的深处某处发生错误。作为该错误消息的一部分,编译器应该为您提供导致它的模板实例的列表。您需要将该跟踪追溯到您的代码,以查看您错误使用的模板。