簡體   English   中英

c ++ 11包括 <cstdlib> 有時c ++ 03不會?

[英]c++11 includes <cstdlib> at times when c++03 will not?

看看這個小程序吧。

#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

我的最終問題是,當你包含iostream時,新標准是否保證所有cstdlib都會被引入全局命名空間?

不,如果您需要它的功能,您應該自己#include它。 如果你使用<iostream> “免費”獲得它,那表明你的<iostream>標頭需要它,但是你依賴於你的C ++庫的實現細節。

順便說一下, #include <cstdlib>不能保證將C函數帶入全局命名空間(盡管在C ++實現中通常會這樣做); 保證將它們放在命名空間std

除第18條至第30條和附件D中所述外,每個標題cname的內容應與C標准庫(1.2)或C Unicode TR中指定的相應標題name.h的內容相同。 ,好像通過包含。 但是,在C ++標准庫中,聲明(除了在C中定義為宏的名稱除外)都在命名空間std的命名空間范圍(3.3.6)內。 未指定這些名稱是否首先在全局命名空間范圍內聲明,然后通過顯式using -declarations(7.3.3)注入命名空間std

(標准,第17.6.1.2節)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM