看看这个小程序。
编译将会生成以下错误信息:
可以理解。所有这些都存在于“cstdlib”头文件中,我忘了包含它。
然而,编译时需要使用:
#include <iostream>
int main(){
int var = atoi("-99"); //convert string to int
var = abs(var); //takes absolute value
std::cout << var+1 <<'\n'; //outputs 100
return EXIT_SUCCESS;
}
编译将会生成以下错误信息:
$ g++ -o main main.cpp
main.cpp: In function ‘int main()’:
main.cpp:5:13: error: ‘atoi’ was not declared in this scope
main.cpp:6:16: error: ‘abs’ was not declared in this scope
main.cpp:9:10: error: ‘EXIT_SUCCESS’ was not declared in this scope
可以理解。所有这些都存在于“cstdlib”头文件中,我忘了包含它。
然而,编译时需要使用:
$ g++ -std=c++0x -o main main.cpp
没有问题。
查看"cstdlib"头文件的源代码,我发现在底部有以下代码:
#ifdef __GXX_EXPERIMENTAL_CXX0X__
# if defined(_GLIBCXX_INCLUDE_AS_TR1)
# error C++0x header cannot be included from TR1 header
# endif
# if defined(_GLIBCXX_INCLUDE_AS_CXX0X)
# include <tr1_impl/cstdlib>
# else
# define _GLIBCXX_INCLUDE_AS_CXX0X
# define _GLIBCXX_BEGIN_NAMESPACE_TR1
# define _GLIBCXX_END_NAMESPACE_TR1
# define _GLIBCXX_TR1
# include <tr1_impl/cstdlib>
# undef _GLIBCXX_TR1
# undef _GLIBCXX_END_NAMESPACE_TR1
# undef _GLIBCXX_BEGIN_NAMESPACE_TR1
# undef _GLIBCXX_INCLUDE_AS_CXX0X
# endif
#endif
我不确定这是否相关..完整的头文件代码在这里
我的最终问题是,新标准是否保证当您包含iostream时,将在全局命名空间中引入所有的cstdlib?
我找不到任何关于此事的文档。对我来说似乎是这样,你觉得呢?
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1