头文件
每个C++/C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。
C++/C程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀,C++程序的定义文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀)。
1.1 版权和版本的声明
版权和版本的声明位于头文件和定义文件的开头(参见示例1-1),主要内容有:
(1)版权信息。
(2)文件名称,标识符,摘要。
(3)当前版本号,作者/修改者,完成日期。
(4)版本历史信息。
示例1-1 版权和版本的声明
1.2 头文件的结构
头文件由三部分内容组成:
(1)头文件开头处的版权和版本声明(参见示例1-1)。
(2)预处理块。
(3)函数和类结构声明等。
假设头文件名称为 graphics.h,头文件的结构参见示例1-2。
【规则1-2-1】为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。
【规则1-2-2】用 #include <filename.h> 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
【规则1-2-3】用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。
【建议1-2-1】头文件中只存放“声明”而不存放“定义”
在C++ 语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。建议将成员函数的定义与声明分开,不论该函数体有多么小。
【建议1-2-2】不提倡使用全局变量,尽量不要在头文件中出现象extern int value 这类声明。
// 版权和版本声明见示例1-1,此处省略。
#ifndef GRAPHICS_H // 防止graphics.h被重复引用
#define GRAPHICS_H
#include <math.h> // 引用标准库的头文件
…
#include “myheader.h” // 引用非标准库的头文件
…
void Function1(…); // 全局函数声明
…
class Box // 类结构声明
{
…
};
#endif
示例1-2 C++/C头文件的结构
1.3 定义文件的结构
定义文件有三部分内容:
(1) 定义文件开头处的版权和版本声明(参见示例1-1)。
(2) 对一些头文件的引用。
(3) 程序的实现体(包括数据和代码)。
假设定义文件的名称为 graphics.cpp,定义文件的结构参见示例1-3。
// 版权和版本声明见示例1-1,此处省略。
#include “graphics.h” // 引用头文件
…
// 全局函数的实现体
void Function1(…)
{
…
}
// 类成员函数的实现体
void Box::Draw(…)
{
…
}
示例1-3 C++/C定义文件的结构
1.4 头文件的作用
早期的编程语言如Basic、Fortran没有头文件的概念,C++/C语言的初学者虽然会用使用头文件,但常常不明其理。这里对头文件
的作用略作解释:
(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用
户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。
(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这
一简单的规则能大大减轻程序员调试、改错的负担。
一般来说,头文件提供接口,源文件提供实现。但是有些实现比较简单的,也可以直接写在头文件里,这样头文件接口实现一起提供。
在编译时,源文件里的实现会被编译成临时文件,运行时刻程序找到头文件里的接口,根据接口找到这些临时文件,来调用它们这些实现。 |
之所以在 C++ 中要使用头文件,最主要的原因是 C++ 的同一个项目可能有多个源代码文件,要命的是这些源代码是分别单独编译的。
也就是说,在编译其中一个文件时,编译器并不知道其它文件中定义的内容,如类、全局变量等。
这就要求我们必须在要使用某个类、函数或变量的每个文件中声明它,否则 C++ 是无法找到它的。
很多文件可能都需要使用加法。假设有一个文件 b.cpp 需要使用这个函数,那么,它必须先声明它,虽然不需要再重写。
如果有很多文件都要使用这个函数,那么这会变得麻烦,特别的,如果你写了一个类,那么你需要维护大量的声明(对于每一个 public 对象),并且如果你的类的定义发生了改变,你可能不得不改变无数个声明。
所以,C++ 语言提出了头文件的概念。你只需要在头文件中声明一次,在实现文件中定义一次,在所有需要用的文件中,就只需要引用这个头文件,相当于每个文件都包含了一个声明。
为了防止头文件的重复包含,通常应该使用预处理指令 #define (定义符号)、#ifndef(如果没有定义)、#endif(结束判断)来书写头文件的内容。
请理解如下的例子,它是对上个笔记中的 Xiao 类的改进。
|
如同名字一样的意思,NameSpace:名字空间,之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象,对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了,为了解决这个问题,引入了名字空间这个概念,通过使用using namespace xxx;你所使用的库函数或变量就是在该名字空间中定义的.这样以来就不会引起不必要的冲突了. 所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。 一 :<iostream>和<iostream.h>格式不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。 using namespace std;是定义全局空间。
c++中的头文件#include<iostream>等引用时必须加using namespace std;不加的话,需要有std::cout这样的形式来引用库中的内容。而C中的则不必如#include<string.h>和#include<cstring>效果相同。
名字空间,实质上也是为了方便程序在不同平台上正确的运行。 ---------------------------------------------------------------
namespace是为了解决C++中的名字冲突而引入的。 什么是名字冲突呢?比如,在文件x.h中有个类MyClass, 在文件y.h中也有个类MyClass,而在文件z.cpp中要同时 引用x.h和y.h文件。显然,按通常的方法是行不能的, 那怎么办呢?引入namespace即可。例如: 在x.h中的内容为 // x.h namespace MyNamespace1 { class MyClass { public: void f(); private: int m; } };
在y.h中的内容为 // y.h namespace MyNamespace2 { class MyClass { public: void f(); private: int m; } };
然后在z.cpp中引入x.h和y.h // z.cpp #include "x.h" #include "y.h"
void z::f() { //声明一个文件x.h中类MyClass的实例x MyNamespace1::MyClass x; //声明一个文件x.h中类MyClass的实例x MyNamespace2::MyClass y;
//调用文件x.h中的函数f x.f(); //调用文件y.h中的函数f y.f(); } 名字空间实质上是一个作用域。
|
分享到:
相关推荐
C++头文件2.0(万能头文件,必背头文件)C++头文件2.0(万能头文件,必背头文件)C++头文件2.0(万能头文件,必背头文件)C++头文件2.0(万能头文件,必背头文件)C++头文件2.0(万能头文件,必背头文件)C++头文件...
首先,我们要理解C++头文件的作用。在C++编程中,头文件(通常以`.h`或`.hpp`为扩展名)包含了函数声明、类定义和其他重要信息,这些信息供编译器在编译期间使用。然而,Delphi,作为基于Pascal语言的开发环境,其...
标题提到的“C++头文件代码翻译为C#的工具”就是为了帮助开发者将C++编写的DLL文件中的函数接口转换成C#可以调用的形式。 C++头文件(.h文件)通常包含了函数声明、结构体、枚举等类型定义,这些都是构建C++接口的...
"C++头文件转Delphi .pas"这个工具就为此目的而设计,它帮助开发者将C++的头文件(.h)转换为Delphi可以理解的单元文件(.pas)。 C++的头文件通常包含了类定义、函数声明、枚举、结构体等信息,这些信息在Delphi中...
C++头文件2.1(万能头文件+windows函数)C++头文件2.1(万能头文件+windows函数)C++头文件2.1(万能头文件+windows函数)C++头文件2.1(万能头文件+windows函数)C++头文件2.1(万能头文件+windows函数)C++头文件...
### C/C++头文件一览知识点解析 #### 一、C/C++基础头文件 在C/C++编程语言中,头文件扮演着极其重要的角色,它们为程序员提供了丰富的库函数和宏定义,使得开发者能够轻松地完成各类编程任务。下面将详细介绍这些...
1. **准备C++头文件**:确保你的C++头文件(.h文件)包含了所有需要调用的函数和结构体声明。这些函数应该遵循C语言的调用约定,因为JNA主要支持C风格的接口。 2. **创建SWIG接口文件**:创建一个SWIG接口文件(.i...
C++头文件1.0(标准化头文件,入门者必背)C++头文件1.0(标准化头文件,入门者必背)C++头文件1.0(标准化头文件,入门者必背)C++头文件1.0(标准化头文件,入门者必背)C++头文件1.0(标准化头文件,入门者必背)...
### C++标准头文件库详解 #### 概述 C++是一种广泛使用的编程语言,它提供了丰富的标准库支持,使得开发者能够高效地进行程序开发。本文将详细介绍C++标准头文件库中的各种头文件,帮助读者更好地理解和使用这些...
头文件分为传统C头文件和标准C++头文件,以及C99新增的一些头文件。 1. **传统C头文件**: - `assert.h`: 提供断言宏`assert()`,用于在调试时检查程序状态。 - `ctype.h`: 包含字符处理函数,如`isalpha()`, `...
C/C++头文件包含 C/C++头文件包含是指在C/C++编程语言中使用头文件的规则和规范。本文将从多方面阐述C/C++头文件包含的知识点,帮助开发者更好地理解和使用C/C++语言。 C/C++语言关系 C++虽然是以C语言为基础发展...
一个C/C++头文件转delphi的小工具,转换一些结构体,常量,的头文件很有用。函数类的转换暂时没有。之前找的比较老,是d7版本的。现在改成Ex版可编译,优化了一下结构和类型常量的对照,不过转换后还是需要稍作修改...
本主题将深入探讨“C++头文件解析”及其相关的词法分析过程。 词法分析,也称为扫描或词法分析器,是编译器设计中的第一步,它将源代码分解为一个个称为标记(Token)的最小有意义单位。在C++中,这些标记可能包括...
### C/C++头文件概述与整合应用 #### 标题解析 标题“C C++头文件一览.pdf”明确指出文档内容涉及C语言和C++语言中的头文件介绍。头文件在C/C++编程中扮演着极其重要的角色,它们通常包含了预处理器指令、宏定义、...
C++头文件的使用是理解和编写高效代码的关键。本资料"**C++头文件一览.zip**"提供了一份关于C++常用头文件的详细清单,解压后为DOC格式,对于学习和参考C++标准库非常有帮助。 1. ****: 这是最常见的头文件,用于...
《C++头文件和外设例程程序包安装详解》 C++编程在嵌入式领域,特别是针对DSP281x系列芯片的开发中,头文件和外设例程的正确安装和使用至关重要。本文将详细介绍如何安装C++头文件和外设例程程序包,并阐述其在DSP...
### C和C++头文件对比一览 #### 引言 本文旨在探讨C语言与C++语言在头文件方面的异同之处。随着C++的发展和完善,其标准库经历了一系列的重大变革,尤其是在1998年标准化之后。这些变化不仅体现在命名习惯上,还...
根据给定的文件信息,我们可以深入探讨C++头文件中的关键知识点,这些头文件涵盖了从基本输入输出到复杂数据结构和算法的各种功能。下面将详细解释每个头文件的主要用途和包含的重要函数或类。 1. **标准C库头文件*...