头文件的作用
早期的编程语言如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();
}
名字空间实质上是一个作用域。
分享到:
相关推荐
"sha256_c++sha256头文件"可能指的是一个C++项目,该项目提供了SHA256的实现,但描述提到头文件没有被添加进去,这可能是开发过程中遇到的问题。头文件在C++中非常重要,因为它们包含了函数声明、类定义和其他编译时...
2. `<vector>`和`<list>`:这两个头文件分别定义了动态数组(vector)和双向链表(list)容器,是STL(Standard Template Library)的一部分,提供了数据结构和算法的基础。 3. `<algorithm>`:这个头文件包含了...
#### 一、C/C++基础头文件 在C/C++编程语言中,头文件扮演着极其重要的角色,它们为程序员提供了丰富的库函数和宏定义,使得开发者能够轻松地完成各类编程任务。下面将详细介绍这些头文件的功能及其应用场景。 ####...
根据给定的文件信息,我们可以深入探讨C++头文件中的关键知识点,这些头文件涵盖了从基本输入输出到复杂数据结构和算法的各种功能。...理解并熟练掌握这些头文件的使用,是编写高效、健壮的C++程序的基础。
1. `<iostream>`:这是C++中最基础的输入/输出流头文件,包含了`std::cin`(标准输入)、`std::cout`(标准输出)和`std::cerr`(错误输出)等对象,用于进行基本的文本输入输出操作。 2. `<string>`:这个头文件...
这些头文件是C++程序员日常开发的基础,它们提供了丰富的功能,使得编写高效、可维护的代码变得更加容易。使用这些头文件时,通常会通过`#include`指令将其引入到源文件中,以便访问其中定义的函数、类和对象。在...
这些头文件是C++编程的基础。 3. **预处理器指令#include**:在C++程序中,`#include`指令用于将头文件的内容插入到源文件中。例如,`#include <iostream>`会将iostream头文件的内容引入,使得我们可以使用`std::...
#### 二、基础头文件 1. **`<assert.h>`** - **用途**:提供断言功能,用于调试阶段检查条件是否满足。 - **关键函数**: - `assert(expression)`: 如果表达式为假,则会触发错误并显示相关信息。 2. **`...
《C++头文件到Delphi源码转换工具详解》 在跨平台开发或者代码共享的场景中,有时...虽然并非所有C++特性都能完美转换,但对于大多数基础结构和函数声明,它都能提供有效的转换,极大地促进了两种语言之间的协同开发。
本文将深入探讨C++中的函数,并特别关注`string`类型的处理以及与之相关的头文件。 首先,让我们了解C++中的函数基础。函数在C++中定义了一段可重用的代码,可以接受零个或多个参数,并可能返回一个值。例如,一个...
在C++编程中,自定义...在实际使用中,开发者只需包含这个头文件,就能快速构建游戏的基础设施,专注于游戏逻辑的实现。不过,使用这样的万能头文件也需要谨慎,因为它可能导致代码过于紧密耦合,不易维护和扩展。
C++是一种强大的编程语言,它的库包含了丰富的...以上是C++中常用头文件的功能概述,它们构成了C++强大功能的基础,方便开发者编写高效、可靠的代码。在实际编程中,根据需求选择合适的头文件可以极大地提高开发效率。
在IT行业中,跨语言通信是常见的需求之一,尤其是在Java与C++之间。为了实现这种通信,我们可以使用Java Native Access(JNA),它是一种无需编写原生代码就能直接调用操作系统API或其他本地库的Java库。本篇文章将...
在C/C++编程中,头文件是至关重要的,它们包含了函数声明、类定义和其他编程元素,使得代码可以正确地编译和链接。本篇将详细讲解这些头文件及其包含的知识点。 1. `<algo.h>`:这是一个非标准的头文件,通常在一些...
在C和C++编程语言中,头文件起着至关重要的作用。它们包含了函数声明、类型定义、宏定义以及其他编程元素,使得源代码可以正确编译和链接。让我们深入探讨一下这些头文件及其在C和C++中的应用。 首先,我们来看`c_...
进入C++的世界,C++在C的基础上增加了面向对象特性,因此它不仅有C语言的头文件,还引入了自己特有的头文件。C++的头文件通常以`.hpp`或`.h`为扩展名,如`iostream`用于输入输出操作,包含`std::cin`和`std::cout`;...
1. `<iostream>`:这是C++中最基础的I/O流库,主要用于输入输出操作。`std::cin`用于从标准输入(通常是键盘)读取数据,`std::cout`用于向标准输出(通常是屏幕)打印信息。例如: ```cpp #include int main() ...
在C++中,基础头文件主要用于提供一些基本的功能支持,例如输入输出、字符处理等。以下是一些重要的基础头文件: - **`<assert.h>`**:提供了断言宏`assert()`,用于调试阶段检查条件是否为真。 - **`<ctype.h>`**...
头文件是C++编程语言的基础组件,它们提供了各种函数、宏、变量和类型定义,帮助开发者快速构建应用程序。本文将对Visual C++头文件进行分类,列举了传统C++、标准C++和C99三个部分,总共涵盖了近50个头文件,每个...
在深入探讨C与C++头文件的细节之前,我们首先需要理解头文件...掌握这些头文件的使用是成为高效C/C++开发者的关键之一。无论是进行简单的输入输出操作,还是复杂的网络编程和多线程处理,头文件都是不可或缺的工具箱。