8

この小さなプログラムを見てください。

#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
4

1 に答える 1

16

私の最終的な質問は、iostreamを含めると、新しい標準によってすべてのcstdlibがグローバル名前空間に取り込まれることが保証されるかどうかです。

いいえ#include。その機能が必要な場合は、自分で行う必要があります。で「無料」で入手できる場合は<iostream><iostream>ヘッダーにそれが必要であることを示していますが、C++ライブラリの実装の詳細に依存しています。

ところで、#include <cstdlib>C関数をグローバル名前空間に取り込むことは保証されていません(ただし、C ++実装では一般的にそうなります)。それらを名前空間に入れることが保証されていますstd

第18条から第30条および付属書Dに記載されている場合を除き、各ヘッダーの内容は、C標準ライブラリ(1.2)またはC Unicode TRで指定されているようcnameに、対応するヘッダーの内容と同じである必要があります。name.h包含。ただし、C ++標準ライブラリでは、宣言(Cでマクロとして定義されている名前を除く)は、名前空間の名前空間スコープ(3.3.6)内にありますstd。これらの名前が最初にグローバル名前空間スコープ内で宣言され、次にstd明示的なusing宣言(7.3.3)によって名前空間に挿入されるかどうかは指定されていません。

(標準、セクション17.6.1.2)

于 2012-05-04T08:51:27.513 に答える