赞
踩
头文件是c++自己定义库函数的地方,虽然它定义的函数的方式我们看不懂,但是像int,char,memset等函数都是他在头文件里给你编好的,下边给大家看一下我们熟悉的iostream头文件里面是什么样的:
- // Standard iostream objects -*- C++ -*-
-
- // Copyright (C) 1997-2014 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 3, or (at your option)
- // any later version.
-
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
-
- // Under Section 7 of GPL version 3, you are granted additional
- // permissions described in the GCC Runtime Library Exception, version
- // 3.1, as published by the Free Software Foundation.
-
- // You should have received a copy of the GNU General Public License and
- // a copy of the GCC Runtime Library Exception along with this program;
- // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
- // <http://www.gnu.org/licenses/>.
-
- /** @file include/iostream
- * This is a Standard C++ Library header.
- */
-
- //
- // ISO C++ 14882: 27.3 Standard iostream objects
- //
-
- #ifndef _GLIBCXX_IOSTREAM
- #define _GLIBCXX_IOSTREAM 1
-
- #pragma GCC system_header
-
- #include <bits/c++config.h>
- #include <ostream>
- #include <istream>
-
- namespace std _GLIBCXX_VISIBILITY(default)
- {
- _GLIBCXX_BEGIN_NAMESPACE_VERSION
-
- /**
- * @name Standard Stream Objects
- *
- * The <iostream> header declares the eight <em>standard stream
- * objects</em>. For other declarations, see
- * http://gcc.gnu.org/onlinedocs/libstdc++/manual/io.html
- * and the @link iosfwd I/O forward declarations @endlink
- *
- * They are required by default to cooperate with the global C
- * library's @c FILE streams, and to be available during program
- * startup and termination. For more information, see the section of the
- * manual linked to above.
- */
- //@{
- extern istream cin; /// Linked to standard input
- extern ostream cout; /// Linked to standard output
- extern ostream cerr; /// Linked to standard error (unbuffered)
- extern ostream clog; /// Linked to standard error (buffered)
-
- #ifdef _GLIBCXX_USE_WCHAR_T
- extern wistream wcin; /// Linked to standard input
- extern wostream wcout; /// Linked to standard output
- extern wostream wcerr; /// Linked to standard error (unbuffered)
- extern wostream wclog; /// Linked to standard error (buffered)
- #endif
- //@}
-
- // For construction of filebuffers for cout, cin, cerr, clog et. al.
- static ios_base::Init __ioinit;
-
- _GLIBCXX_END_NAMESPACE_VERSION
- } // namespace
-
- #endif /* _GLIBCXX_IOSTREAM */
iostream库里面就定义了我们所熟知的cin和cout函数
其他的还有cerr,clog,wcin,wcout,wcerr,wclog等等函数。而有些人就不太明白了,那头文件还能导入头文件吗?
答案是肯定的,因为它里面的一些函数如static,extern,namespace等函数也需要引入头文件,因为里面定义函数的过程过于深奥,所以不在这里过多讲述。
下面再给大家啃一个不同的头文件内部:
- // Components for manipulating sequences of characters -*- C++ -*-
-
- // Copyright (C) 1997-2014 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 3, or (at your option)
- // any later version.
-
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
-
- // Under Section 7 of GPL version 3, you are granted additional
- // permissions described in the GCC Runtime Library Exception, version
- // 3.1, as published by the Free Software Foundation.
-
- // You should have received a copy of the GNU General Public License and
- // a copy of the GCC Runtime Library Exception along with this program;
- // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
- // <http://www.gnu.org/licenses/>.
-
- /** @file include/string
- * This is a Standard C++ Library header.
- */
-
- //
- // ISO C++ 14882: 21 Strings library
- //
-
- #ifndef _GLIBCXX_STRING
- #define _GLIBCXX_STRING 1
-
- #pragma GCC system_header
-
- #include <bits/c++config.h>
- #include <bits/stringfwd.h>
- #include <bits/char_traits.h> // NB: In turn includes stl_algobase.h
- #include <bits/allocator.h>
- #include <bits/cpp_type_traits.h>
- #include <bits/localefwd.h> // For operators >>, <<, and getline.
- #include <bits/ostream_insert.h>
- #include <bits/stl_iterator_base_types.h>
- #include <bits/stl_iterator_base_funcs.h>
- #include <bits/stl_iterator.h>
- #include <bits/stl_function.h> // For less
- #include <ext/numeric_traits.h>
- #include <bits/stl_algobase.h>
- #include <bits/range_access.h>
- #include <bits/basic_string.h>
- #include <bits/basic_string.tcc>
-
- #endif /* _GLIBCXX_STRING */
这个头文件就是属于很多人也都知道的<string>头文件,看到这个头文件,你们有没有发现什么?对了,就是这个头文件string基本都是由其他的头文件组成的,什么<bits/range_access.h>等等的头文件。引入头文件就相当于把这个头文件拥有了其他头文件的能力,这个能力指的就是其他头文件定义的函数,数据类型等。我们的程序要导入头文件也是同一个原因。
那头文件有没有基本上都是程序的呢?也有。再来看下一个:
- // Helpers for ostream inserters -*- C++ -*-
-
- // Copyright (C) 2007-2014 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
- // software; you can redistribute it and/or modify it under the
- // terms of the GNU General Public License as published by the
- // Free Software Foundation; either version 3, or (at your option)
- // any later version.
-
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
-
- // Under Section 7 of GPL version 3, you are granted additional
- // permissions described in the GCC Runtime Library Exception, version
- // 3.1, as published by the Free Software Foundation.
-
- // You should have received a copy of the GNU General Public License and
- // a copy of the GCC Runtime Library Exception along with this program;
- // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
- // <http://www.gnu.org/licenses/>.
-
- /** @file bits/ostream_insert.h
- * This is an internal header file, included by other library headers.
- * Do not attempt to use it directly. @headername{ostream}
- */
-
- #ifndef _OSTREAM_INSERT_H
- #define _OSTREAM_INSERT_H 1
-
- #pragma GCC system_header
-
- #include <iosfwd>
- #include <bits/cxxabi_forced.h>
-
- namespace std _GLIBCXX_VISIBILITY(default)
- {
- _GLIBCXX_BEGIN_NAMESPACE_VERSION
-
- template<typename _CharT, typename _Traits>
- inline void
- __ostream_write(basic_ostream<_CharT, _Traits>& __out,
- const _CharT* __s, streamsize __n)
- {
- typedef basic_ostream<_CharT, _Traits> __ostream_type;
- typedef typename __ostream_type::ios_base __ios_base;
-
- const streamsize __put = __out.rdbuf()->sputn(__s, __n);
- if (__put != __n)
- __out.setstate(__ios_base::badbit);
- }
-
- template<typename _CharT, typename _Traits>
- inline void
- __ostream_fill(basic_ostream<_CharT, _Traits>& __out, streamsize __n)
- {
- typedef basic_ostream<_CharT, _Traits> __ostream_type;
- typedef typename __ostream_type::ios_base __ios_base;
-
- const _CharT __c = __out.fill();
- for (; __n > 0; --__n)
- {
- const typename _Traits::int_type __put = __out.rdbuf()->sputc(__c);
- if (_Traits::eq_int_type(__put, _Traits::eof()))
- {
- __out.setstate(__ios_base::badbit);
- break;
- }
- }
- }
-
- template<typename _CharT, typename _Traits>
- basic_ostream<_CharT, _Traits>&
- __ostream_insert(basic_ostream<_CharT, _Traits>& __out,
- const _CharT* __s, streamsize __n)
- {
- typedef basic_ostream<_CharT, _Traits> __ostream_type;
- typedef typename __ostream_type::ios_base __ios_base;
-
- typename __ostream_type::sentry __cerb(__out);
- if (__cerb)
- {
- __try
- {
- const streamsize __w = __out.width();
- if (__w > __n)
- {
- const bool __left = ((__out.flags()
- & __ios_base::adjustfield)
- == __ios_base::left);
- if (!__left)
- __ostream_fill(__out, __w - __n);
- if (__out.good())
- __ostream_write(__out, __s, __n);
- if (__left && __out.good())
- __ostream_fill(__out, __w - __n);
- }
- else
- __ostream_write(__out, __s, __n);
- __out.width(0);
- }
- __catch(__cxxabiv1::__forced_unwind&)
- {
- __out._M_setstate(__ios_base::badbit);
- __throw_exception_again;
- }
- __catch(...)
- { __out._M_setstate(__ios_base::badbit); }
- }
- return __out;
- }
-
- // Inhibit implicit instantiations for required instantiations,
- // which are defined via explicit instantiations elsewhere.
- #if _GLIBCXX_EXTERN_TEMPLATE
- extern template ostream& __ostream_insert(ostream&, const char*, streamsize);
-
- #ifdef _GLIBCXX_USE_WCHAR_T
- extern template wostream& __ostream_insert(wostream&, const wchar_t*,
- streamsize);
- #endif
- #endif
-
- _GLIBCXX_END_NAMESPACE_VERSION
- } // namespace std
-
- #endif /* _OSTREAM_INSERT_H */
这个是一个不太知名的头文件<ostream_insert.h>头文件,他基本全是由代码组成,也就是定义的函数和数据类型较多,导入的头文件较少。
接下来就到了一个重头戏:如何导入头文件?
这个问题可能有些人看完前面的就已经有答案了,就是#include+<导入头文件名称>就行了。
十分简单。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。