C++ include机制基本概念详解

开发 后端
刚刚接触C++编程语言的朋友们今天可以通过这篇文章对C++ include机制的基本概念有一个详细的了解。以方便大家对这方面知识的学习。

C++编程语言这样的一个功能强大的语言中,有很多高深的内容值得我们去深入的研究。比如今天为大家介绍的C++ include机制就是其中一个比较难以理解的内容。下面就让我们一起来对此进行解读。

做c/c++编程的对#include指令都不会陌生,绝大多数也都知道如何使用,但我相信仍有人对此是一知半解

  1. C:  
  2. #include < stdio.h> 
  3. C++:  
  4. #include < iostream> 

表示包含C/C++标准输入头文件。包含指令不仅仅限于.h头文件,可以包含任何编译器能识别的C/C++代码文件,包括.c,.hpp,.cpp,.hxx,.cxx等,甚至.txt,.abc等等都可以#t#

1.C++ include机制名词解释

预处理(preprocess)

为方便编译器处理而设置的一种机制,包括一些常用预处理指令和语句,我们统称为预处理系统。

如#include #define #if...#else...#endif #pragma等。这些指令的实现是由编译器来决定的(implementation specified)提到预处理指令,顺便说一下头文件防止重复包含的2种方法

a.保护宏

  1. #ifndef _ABCDE_H  
  2. #define _ABCDE_H  
  3. /*  
  4. 代码部分  
  5. */  
  6. #endif 

在被包含过一次之后,宏_ABCDE_H已经有了,下次再碰到就会略过从#define _ABCDE_H开始到#endif之间的代码
还有一种特定编译器支持的指令:

  1. b.#pragma once 

能保证该文件(物理上的)只被编译一次,也能起到防止重复包含的作用

但这2种方式是有区别的:

a.Macro guard可移植性好,绝大多数编译器都支持,而且万一不小心拷贝了几分相同的代码也不会出问题,但你得确保这个宏名不会与其他的宏冲突,否则等编译器报出一大堆错误的时候你可能会觉得莫名其妙;

b.#pragma once指令简单,它能保证该文件(物理上的)只被编译一次,不用去费劲的想不同的宏名,但如果有几份该文件的拷贝,显然起不到作用。

 

声明(declaration)

指将一个名称引入当前编译单元,或者重新声明一个前面已经声明过的名称,声明指定了如何解释一个名称和该名称具有的属性;
例如:

  1. int main(void)  
  2. {  
  3. int a; // 声明了变量a,类型为int  
  4. int *pa; // 声明了变量pa,类型为指向int型的指针类型  

 

 

 

定义(definition)

除了以下情况,声明就是定义

a.声明函数但不包括函数体;

b.声明包含extern链接限定符,例如:extern int a;

c.声明既没有初始化语法,也没有函数体;

d.类声明中声明静态数据成员;

e.类名字声明;

f.typedef声明;

g.using声明或者using指令;

以上情况适用于C具有的特征,C++则完全适用,一般来说定义要为其对象分配或预留存储空间,而声明则不用。

编译单元(translation unit)

一个源文件,.c .cpp等和它所包含的文件一起,在经过预处理之后形成一个源码文件,标准称之为translation unit(编译单元)包括一系列的声明和定义;一个program(程序)由一个或多个编译单元组成。编译器将各个翻译单元编译为目标代码(.obj), 通过连接器(linker)将这些编译后的编译单元(即目标代码)连接成完整的指令序列(可执行文件、静态库、动态库等)。

一次定义规则(one definition rule)

是指定义在所有进入连接的编译单元中只能有一次。

 

 

2.C++ include机制观点、例子

A:头文件只放声明

  1. example_a.h  
  2. void function();  
  3. example_a.cpp:  
  4. #include "example_a.h"  
  5. void function()  
  6. {} 

 

 

B.标准头文件的使用

最新的C++标准库中的一切内容都被放在名字空间std中(名字空间中的内容对外是不可见的),但是带来了一个新问 题,无数现有的C++代码都依赖于使用了多年的伪标准库中的功能,如声明在< iostream.h>等头文件中的功能,使用std包装标准库 导致现有代码的不可用,为了兼容这种情况,标准委员会为包装了std的那部分标准库创建了新的头文件,新的头文件的文件名与旧的一样,只是没有.h这个后 缀,如< iostream.h>就变成了< iostream>。对于C头文件,采用同样的方法,但还在每个头文件名前加了字符 c,如< string.h>就变成了< cstring>,< stdio.h>变成了< cstdio>。 最好使用新的文件头,使用新的文件头的C++程序,需要使用using namespace std或者using namespace std::指定的类名,等方法来使需要的类对于我们的代码可视。

3.总结

既然是经常使用的东西,我们就应该明白它的原理,减少编程时的困惑,提高编程的效率。以上就是对C++ include机制的相关介绍。

责任编辑:曹凯 来源: 博客园
相关推荐

2010-02-06 14:04:58

C++内存使用机制

2010-02-02 10:33:22

C++引用

2010-02-01 17:24:41

C++循环语句

2010-02-05 12:57:20

C++ kdevelo

2010-02-03 13:22:07

C++时间

2010-02-02 13:41:01

C++类继承

2010-02-03 11:11:18

C++类型转换

2010-02-03 14:36:47

C++仿函数

2010-02-05 17:34:37

C++函数模板

2010-02-04 13:56:24

C++类模板特化

2010-02-04 10:08:00

C++静态成员函数

2010-02-01 14:07:12

C++多态性

2010-07-12 09:43:38

Symbian开发

2009-12-29 18:29:09

Silverlight

2010-02-23 16:32:29

WCF服务

2010-02-04 17:39:48

C++字符串类型

2010-02-06 15:58:10

C++集合初始化

2010-02-04 17:32:43

C++中C风格字符串

2009-12-21 15:33:07

WCF集合元素

2010-02-24 17:17:04

WCF宿主环境
点赞
收藏

51CTO技术栈公众号