`
teamojiao
  • 浏览: 350334 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

c c++ include机制简述(ZT)

阅读更多

1.引言
做c/c++编程的对#include指令都不会陌生,绝大多数也都知道如何使用,但我相信仍有人对此是一知半解,
C:
#include <stdio.h>
C++:
#include <iostream>
表示包含C/C++标准输入头文件。包含指令不仅仅限于.h头文件,可以包含任何编译器能识别的C/C++代码文件,包括.c,.hpp,.cpp,.hxx,.cxx等,甚至.txt,.abc等等都可以

2.名词解释
preprocess
预处理:为方便编译器处理而设置的一种机制,包括一些常用预处理指令和语句,我们统称为预处理系统。
#include #define #if...#else...#endif #pragma
这些指令的实现是由编译器来决定的(implementation specified)

提到预处理指令,顺便说一下头文件防止重复包含的2种方法
a.保护宏(暂且称为Macro guard 宏卫兵?):
#ifndef _ABCDE_H
#define _ABCDE_H
/*
代码部分
*/
#endif

在被包含过一次之后,宏_ABCDE_H已经有了,下次再碰到就会略过从#define _ABCDE_H开始到#endif之间的代码
还有一种特定编译器支持的指令:
b.#pragma once
能保证该文件(物理上的)只被编译一次,也能起到防止重复包含的作用

但这2种方式是有区别的:
a.Macro guard可移植性好,绝大多数编译器都支持,而且万一不小心拷贝了几分相同的代码也不会出问题,但你得确保这个宏名不会与其他的宏冲突,否则等编译器报出一大堆错误的时候你可能会觉得莫名其妙;
b.#pragma once指令简单,它能保证该文件(物理上的)只被编译一次,不用去费劲的想不同的宏名,但如果有几份该文件的拷贝,显然起不到作用。

declaration
声明:指将一个名称引入当前编译单元,或者重新声明一个前面已经声明过的名称,声明指定了如何解释一个名称和该名称具有的属性;
例如:
int main(void)
{
int a;  // 声明了变量a,类型为int
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
一次定义规则:是指定义在所有进入连接的编译单元中只能有一次。

3.观点、例子
A:头文件只放声明
example_a.h
void function();

example_a.cpp:
#include "example_a.h"
void function()
{}


B.被包含的文件可以使用任意扩展名:
只要是用符合标准的代码编写的文本文件,就可以使用#include来进行包含,包括.cpp .c等常见的源文件扩展名;
example_b_1.b
void function();

example_b_1.cpp:
#include "example_b_1.b"
void function()
{}



example_b_2.b
void function1();
void function2();



example_b_21.cpp:
void function1()
{}



example_b_22.cpp:
#include "example_b_1.b"
#include "example_b_21.cpp"
void function2()
{}


上面的例子中,example_b_21.cpp仅被包含在xample_b_22.cpp中,不再被其他的文件包含,而且不加入工程中;

C.标准头文件的使用
最新的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::指定的类名,等方法来使需要的类对于我们的代码可视。

4.总结
既然是经常使用的东西,我们就应该明白它的原理,减少编程时的困惑,提高编程的效率。

分享到:
评论

相关推荐

    不错的c语言c++语言课程设计项目-学生成绩管理系统.rar

    不错的c语言c++语言课程设计项目--学生成绩管理系统 不错的c语言c++语言课程设计项目--学生成绩管理系统 不错的c语言c++语言课程设计项目--学生成绩管理系统 不错的c语言c++语言课程设计项目--学生成绩管理系统 不错...

    C C++ 库函数 C语言 C++语言 编程 初学者

    2. **错误处理**:C语言中通常使用返回值来表示错误,而C++引入了异常处理机制,通过`try-catch`块来捕获和处理程序运行时的异常情况。 3. **内存管理**:C++的智能指针(如`std::unique_ptr`、`std::shared_ptr`)...

    c++ Include头文件资源包

    "c++ Include头文件资源包"是一个集合了470个C++和C常用头文件的综合资源,这对于开发者来说是一份非常有价值的参考资料。下面我们将详细探讨其中一些关键的头文件及其功能。 首先,`Windows.h`是Windows API的核心...

    C语言调用C++类中的方法

    首先,为了使C语言能够调用C++的方法,我们需要确保C++类具备"extern 'C'"属性,这使得C++编译器按照C语言的规则进行链接。在C++源文件中,我们可以这样声明: ```cpp extern "C" { // 在这里声明你的C++方法 ...

    从C语言转C++简明教程

    在编程世界中,C语言和C++是两个广泛使用的编程语言,它们各有特色,但C++作为C语言的超集,提供了更多的高级特性。本文档“从C语言转C++简明教程”将引导你从熟悉C语言的基础出发,逐步过渡到掌握C++的核心概念和...

    不错的c语言c++语言课程设计项目-KTV歌曲系统、学生档案管理系统、个人收支系统、职工管理系统等.rar

    不错的c语言c++语言课程设计项目--KTV歌曲系统、学生档案管理系统、个人收支系统、职工管理系统等 不错的c语言c++语言课程设计项目--KTV歌曲系统、学生档案管理系统、个人收支系统、职工管理系统等 不错的c语言c++...

    C语言与C++区别

    C语言与C++的区别,C语言的应用及其他

    各种学习资料 Android Python Java Java web C语言 C++ 教程 视频.zip

    各种学习资料 Android Python Java Java web C语言 C++ 汇编 Android逆向 Arm开发 51单片机 Photoshop 会声会影 Windows Unity cocos2dx 教程 视频 各种学习资料 Android Python Java Java web C语言 C++ 汇编 ...

    C语言实现C++多态

    总结起来,虽然C语言不具备C++那样的内置多态机制,但通过函数指针和结构体,我们可以实现类似的功能。这种方法需要更高的编程技巧和更严谨的设计,但在某些场合下,如嵌入式系统或性能要求极高的场景,可能是一种...

    C++课程设计 地图导航系统.zip

    基于C语言 C++开发的系统项目 课程设计 毕业设计 供参考 源代码+说明 基于C语言 C++开发的系统项目 课程设计 毕业设计 供参考 源代码+说明 基于C语言 C++开发的系统项目 课程设计 毕业设计 供参考 源代码+说明 基于...

    c语言c++语言编程软件Dev C++

    Dev-C++是一个C&C++开发工具,使用 Delphi/Kylix 开发, 它是一款自由软件,遵守GPL协议。它集合了GCC、MinGW等众多自由软件,并且可以从工具支持网站上取得最新版本的各种工具支持,而这一切工作都是来自全球的狂热...

    c语言与c++互相调用示例

    C语言以其简洁高效、低级内存操作而著名,而C++则是在C的基础上加入了面向对象特性,提供了更高级别的抽象。当项目中既有C语言编写的组件又有C++编写的组件时,可能会需要在两者之间进行互相调用,以实现代码复用和...

    duojikongzhi.rar_Unsigned_c++include <reg51>

    标题 "duojikongzhi.rar_Unsigned_c++include &lt;reg51&gt;" 暗示了这个压缩包可能包含一个C++程序,该程序使用了特定的头文件`&lt;reg51.h&gt;`,这通常与单片机编程,尤其是8051系列微控制器有关。在8051微控制器的开发中,`...

    浅析ARM汇编 C语言 C++ 相互调用的方法

    ### 浅析ARM汇编 C语言 C++ 相互调用的方法 #### 一、引言 在嵌入式开发领域,ARM架构因其低功耗、高性能的特点被广泛应用。随着软件开发需求的多样化,不同编程语言间的交互成为了一个重要的技术问题。其中,ARM...

    C语言 C++程序设计完整版——谭浩强

    《C语言 C++程序设计完整版——谭浩强》是一份综合性的编程学习资源,包含了谭浩强教授编写的C语言和C++编程教程。这个压缩包中的内容旨在为初学者提供全面的基础知识,帮助他们掌握这两门重要的编程语言。 首先,...

    使用C语言调C++的程序例子.rar

    3. **C语言调用C++的main.c文件**:这是C语言的主程序,它包含了对C++函数的调用。这里的关键是正确地包括C++的头文件,并遵循C++接口定义的函数原型。 4. **Makefile**:这是一个构建脚本,用于指示编译器如何编译...

    ARM汇编 C语言 C++ 相互调用

    - 在C++中调用C库的例子包括创建C动态库,使用gcc编译器的shared选项和lib选项将其编译为共享库,并使用extern "C"来告诉C++编译器后续的代码应按照C语言链接约定处理。 - 在C++程序中使用extern "C"来声明C库函数...

    c语言c++项目源代码_c语言奔跑的火柴人游戏源码.rar

    《C语言奔跑的火柴人游戏源码》是一个集趣味性、编程挑战性和可扩展性于一体的优质资源。这份珍贵的源代码允许开发者利用C语言的强大功能,创建一个生动有趣的火柴人奔跑游戏。 游戏中的火柴人形象设计简洁而富有...

    C语言c++游戏源代码大全

    使用vs编译的二维小游戏,里面有很多小游戏和网站模板,比如超级玛丽、坦克大战、推箱子、别踩白块、贪吃蛇、种地浇水、盒子接球、连连看、军棋、五子棋、火车订票系统、图书馆借阅、涂格子游戏、火柴人游戏、大丰收...

    c语言c++入门初学C语言C++PDF

    编程及C/C++初学者 FAO 本文原为本人在论坛所发若干帖,意在集中解决新手学习C/C++语言时将遭遇到的各类问题,网友反馈情况良好,集合修订后作为个人作品贴于此处。本贴主要分析概念原理和解决方案,不讨论具体程序...

Global site tag (gtag.js) - Google Analytics