Q: 標準之前(pre-standard)的傳統(traditional) C++ header是怎麼回事?
A: 傳統的C++ header定義classes, values, macros, 以及function,並且以.h做為副檔名(extension)。包括了非標準的STL header,也是以.h做為副檔名 (iostream.h, fstream.h, vector.h, ... 諸如此類),以及過去C的header也是 (stdlib.h, stdio.h, ... 諸如此類)。標準之前的header具有全域的 namespace (Pre-standard headers have all the code in the global namespace,不太確定怎麼翻這句。)
Q: C++的標準header是怎麼回事?
A: 就是那些已經被列入了C++標準的headers。
Q: 我怎麼知道某個header是不是C++的標準header?
A: 命名的方式和傳統的header命名是一樣的,只是去掉了'.h'的副檔名。比如說,'fstream.h'變成了'fstream','memory.h'變成了'memory',諸如此類。
Q: 'iostream.h'是怎麼回事?
A: 這個'iostream.h'從未成為官方的C++標準,這代表任何實作iostream.h的C++ compiler,可以依著它想要的方式去做,而這樣的compiler仍舊會被視為與C++標準相容的。無論如何,C++標準有把input/output library列入其中。
Q: 傳統ANSI C的標準header是怎麼回事?
A: 傳統的ANSI C標準header是以'c'字母為開頭。因此,如'stdio.h'就變成了'cstdio','stdlib.h'就變成了'cstdlib','math.h'就變成了'cmath','time.h'就變成了'ctime',依此類推。以下是完整的列表:
- <assert.h> - <cassert>
- <ctype.h> - <cctype>
- <errno.h> - <cerrno>
- <float.h> - <cfloat>
- <iso646.h> - <ciso646>
- <limits.h> - <climits>
- <locale.h> - <clocale>
- <math.h> - <cmath>
- <setjmp.h> - <csetjmp>
- <signal.h> - <csignal>
- <stdarg.h> - <cstdarg>
- <stddef.h> - <cstddef>
- <stdio.h> - <cstdio>
- <stdlib.h> - <cstdlib>
- <string.h> - <cstring>
- <time.h> - <ctime>
- <wchar.h> - <cwchar>
- <wtype.h> - <cwtype>
Q: 哪一些是C++標準header?
A: 以下是列表:
語言支援:
- Types: <cstddef>
- Implementation properties: <limits>, <climits>, <cfloat>
- Start and termination: <cstdlib>
動態記憶體管理: <new>
- Type identification: <typeinfo>
- Exception handling: <exception>
- Other runtime support: <cstdarg>, <csetjmp>, <ctime>, <csignal>, <cstdlib>
偵錯:
- Exception classes: <stdexcept>
- Assertions: <cassert>
- Error numbers: <cerrno>
一般公用:
- Utility components: <utility>
- Function objects: <functional>
- Memory: <memory>
- Date and time: <ctime>
字串:
- Character traits: <string>
- String classes: <string>
- Null-terminated sequence utilities: <cctype>, <cwctype>, <cstring>, <cwchar>, <cstdlib>
本地化:
- Locales: <locale>
- C library locales: <clocale>
容器:
- Sequences: <deque>, <list>, <queue>, <stack>, <vector>
- Associative containers: <map>, <set>
- Bitset: <bitset>
- Iterators: <iterator>
演算法:
- Non-modifying sequence operations: <algorithm>
- C library algorithms: <cstdlib>
數值:
- Complex numbers: <complex>
- Numeric arrays: <valarray>
- Generalized numeric operations: <numeric>
- C library: <cmath>, <cstdlib>
輸入/輸出:
- Forward declarations: <iosfwd>
- Standard iostream objects: <iostream>
- Iostreams base classes: <ios>
- Stream buffers: <streambuf>
- Formatting and manipulators: <istream>, <ostream>, <iomanip>
- String streams: <sstream>, <cstdlib>
- File streams: <fstream>, <cstdio>, <cwchar>
Q: 我仍舊可以使用舊版的C header嗎 (stdlib.h, stdio.h, etc.)?
A: 所有與C++相容的compiler都支援上述那18個以'.h'做為結尾的header檔,即使它們是不被建議使用的 (stdlib.h, stdio.h, etc.)。這些*.h的 C header檔都是global namespace。使用這些版本的C header仍舊被視為具有可攜性的 (portability),但它有可能與未來的標準不相容。無論如何,這些header在未來不太完全可能被官方標準移除。
Q: 我仍舊可以使用那些非標準的,以'.h'做為副檔名版本的STL header嗎 (iostream.h, fstream.h, vector.h, etc.) ?
A: 這樣的STL header從未成為C++官方標準,大部份的C++ Compiler支援這樣非標準的header,也有些過時的Compiler(如Turbo C++)只支援這樣非標準的寫法。有些更新穎的Compiler,如VC++ 7.1已經不再支援這樣非標準的寫法。除非你必須要使用這些過時的Compiler,否則的話最好是使用標準的寫法 (<iostream>, <fstream>, <vector>
, etc.)。使用*.h的寫法不好。
另外:
在某些Compiler上,你可以發現它同時有'iostream'以及'iostream.h'。如上所述,在include 'iostream'時那些成員(members)是在std namespace,而'iostream.h'是在global namespace。這可能會在某些時後造成混淆(ambiguities),namespace的設計就是為了避免這樣的情況。這也是建議不要使用*.h的原因之一。