看一下这个小程序。
#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” header 中。
但是,使用以下命令进行编译:
$ g++ -std=c++0x -o main main.cpp
没有任何问题。
查看“cstdlib” header 的源代码,我在底部看到以下代码:
#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
我不确定这是否相关..完整的头文件代码here
我的最终问题是,新标准是否可以保证在包含iostream时将所有cstdlib引入全局 namespace ?
我找不到有关此事的任何文档。对我来说是那样,对你来说是那样吗?
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
最佳答案
否。如果需要它的功能,则应自己对其进行#include
编码。如果使用<iostream>
“免费”获得它,则表明<iostream>
header 需要它,但这意味着您依赖C++库的实现细节。
顺便说一句,#include <cstdlib>
不能保证将C函数带入全局 namespace (尽管在C++实现中通常这样做)。确保将它们放在命名空间std
中:
(标准,第17.6.1.2节)