看看这个小程序。
#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