程序不能使用较新版本的g ++进行编译

时间:2010-11-04 20:13:27

标签: c++

我有以下源代码。这在视觉工作室和g ++ 3.4.6中编译得很好;但不是用g ++ 4.4.3(在较新的ubuntu机器上)。较新的编译器要求我明确包含使用atoi。我只想弄清楚可能导致此行为的原因。是先前包含cstdlib的sstream头文件,不再这样做了。或者是编译器行为已经改变。

#include <sstream>

int main()
{
  char str1[]="123";
  int i = atoi(str1);

  printf ("value = %d",i);
  return 0; 
}

4 个答案:

答案 0 :(得分:10)

您还需要为<cstdio>添加printf()

从技术上讲,如果您包含表单<cname>而不是<name.h>的标题,则还需要使用std::限定标准库中的名称。尽管如此,许多标准库实现都是放宽的,并且还将名称放入全局命名空间。

它依赖于实现,哪些标题包含在哪个标题中,因此您应该始终确保包含所需的所有标题,而不是假设它们将自动包含在其中。

答案 1 :(得分:6)

我在Debian上使用GCC 4.4.5,并且标头已更改,因此您不会引入必要的标头。您需要#include <cstdlib>#include <cstdio>来获取atoiprintf,因为编译器抱怨两者都丢失了。

#include <sstream>
#include <cstdio>
#include <cstdlib>


int main()
{
  char str1[]="123";
  int i = std::atoi(str1);

  std::printf ("value = %d",i);
  return 0;
}

答案 2 :(得分:2)

是的。这很常见。您应始终包含您直接使用的所有标头,而不是取决于已包含这些标头的事实。

答案 3 :(得分:1)

编译器行为会发生变化...... <sstream>不使用atoi

可以说你应该一直做#include <cstdlib>,并且你以前的编译器很幸运。

正如James McNeillis指出的那样,您还应该#include <cstdio>才能使用printf功能。