我有以下源代码。这在视觉工作室和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;
}
答案 0 :(得分:10)
您还需要为<cstdio>
添加printf()
。
从技术上讲,如果您包含表单<cname>
而不是<name.h>
的标题,则还需要使用std::
限定标准库中的名称。尽管如此,许多标准库实现都是放宽的,并且还将名称放入全局命名空间。
它依赖于实现,哪些标题包含在哪个标题中,因此您应该始终确保包含所需的所有标题,而不是假设它们将自动包含在其中。
答案 1 :(得分:6)
我在Debian上使用GCC 4.4.5,并且标头已更改,因此您不会引入必要的标头。您需要#include <cstdlib>
和#include <cstdio>
来获取atoi
和printf
,因为编译器抱怨两者都丢失了。
#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
功能。