看一下这个小程序。

#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节)

09-10 04:05