c ++ 11包含<cstdlib>有时c ++ 03不会?

Tre*_*key 7 c++ namespaces g++ c++11

看看这个小程序吧.

#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;
}
Run Code Online (Sandbox Code Playgroud)

编译会创建以下错误消息:

$ 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
Run Code Online (Sandbox Code Playgroud)

可以理解的.所有这些都存在于我忽略的"cstdlib"标题中.
但是,编译:

$ g++ -std=c++0x -o main main.cpp 
Run Code Online (Sandbox Code Playgroud)

没有问题.


查看"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
Run Code Online (Sandbox Code Playgroud)

我不确定这是否相关.. 这里是完整的头文件代码

我的最终问题是,当你包含iostream时,新标准是否保证所有cstdlib都会被引入全局命名空间?

我找不到有关此事的任何文件.对我来说就是这样,对你来说是这样吗?

gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 15

我的最终问题是,当你包含iostream时,新标准是否保证所有cstdlib都会被引入全局命名空间?

#include,如果您需要它的功能,您应该自己动手.如果你"免费"获得它<iostream>,那就是你的<iostream>标题需要它的标志,但是你依赖于你的C++库的实现细节.

顺便说一句,#include <cstdlib>不能保证将C函数带入全局命名空间(尽管在C++实现中通常会这样做); 保证将它们放在命名空间中std:

除第18条至第30条和附件D中所述外,每个标题的内容cname应与相应标题的内容相同name.h,如C标准库(1.2)或C Unicode TR中所规定,视情况而定包容性.但是,在C++标准库中,声明(在C中定义为宏的名称除外)在命名空间的命名空间范围(3.3.6)内std.未指定是否首先在全局命名空间范围内声明这些名称,然后std通过显式using-declarations(7.3.3)将其注入命名空间.

(标准,第17.6.1.2节)

  • 找到链接!请参阅此答案的评论http://stackoverflow.com/a/5079548/396551以及http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#上的官方条目456 456 (2认同)