この小さなプログラムを見てください。
#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