[英]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.