“include”相信大家不会陌生,在我们写代码时,开头总会来一句“include XXX”。include是干嘛用的,很多教材都提到了,因此这里不会再详细解释了,大概意思就是将代码文件需要用到的函数声明、常量等包含到代码文件中。include不是C语言的关键字,而是属于一种预编译的指令,那么预编译又是个什么东东,这也是本文要详细阐述的内容。为了更好地阐述预编译的概念,我们先来看一段代码。有一个头文件,叫“MyCode.h”,内容如下:

MyCode.h文件内容:

int function(int a);



int function(int a)

{

    return a;

}

在MyCode.h文件中,我们声明了一个函数function,它带有一个整型的形参,返回值也是一个整型值,并且实现了这个函数。我们再写一个代码文件,叫“MyCode.c”,内容如下:

MyCode.c文件内容:

#include <stdio.h>

#include "MyCode.h"



int main()

{

    int a = 1;

    int b = 0;

    b = function(a);

    printf("在main函数中,b的值是%d\n", b);

    return 0;

}

在MyCode.c中,我们使用include包含了MyCode.h头文件,并且调用了function函数。在Visual C++ 6.0上编译,结果如下:


在VC编译之前,会有一个预编译的过程,即#include "MyCode.h"这一语句会将MyCode.h中的内容插入到相应的位置,那么预编译之后,MyCode.c如下:

...........

int function(int a);



int function(int a)

{

    return a;

}



int main()

{

    int a = 1;

    int b = 0;

    b = function(a);

    printf("在main函数中,b的值是%d\n", b);

    return 0;

}



预编译完了后,VC会继续编译main函数代码。说到这里,也许你还没看出预编译的用处,别急,我们现在修改下MyCode.c中的main函数体,在调用function时,参数是a+1,如下:

#include <stdio.h>

#include "MyCode.h"



int main()

{

    int a = 1;

    int b = 0;

    b = function(a + 1);

    printf("修改了main函数后,b的值是%d\n", b);

    return 0;

}



我们再来编译,结果如下:


这次编译中,由于MyCode.h没有做任何修改,而且之前也已经编译过一次,因此,MyCode.h本次不会再次编译。但是main函数中做了修改,因此,main函数部分会再次编译, 这就省去了MyCode.h的编译时间。试想,如果MyCode.h中有很多的函数声明,很多的函数实现,很多的变量、常量定义,很多的宏,MyCode.c中也包含了很多的头文件,那么,只要预编译一次这些头文件,以后不管怎么修改main函数,再次编译时,是不是能够省去很多的时间?这就是预编译的好处。当然,如果头文件也被修改了,那么头文件还是要重新编译的。

       说到这里,有人可能发现了,代码中有#include <stdio.h>和#include "MyCode.h",头文件一个用<>包含,一个用“”包含,两者有什么区别呢?

       对于使用<> 来包含头文件的方式,编译器会去系统目录中寻找头文件,而这个系统目录的位置,可以由你手动配置,也可以由编译器默认。比如,在VC中的配置方式如下:


这里指明了头文件在“D:\softwares\Microsoft Visual Studio\VC98”位置,这是VC安装时默认指定的。而“D:\CCode\MySQL\mysql-5.6.24-win32\include”是我安装MySql时,我自己配置的。如果编译器在上述目录中都找不到头文件stdio.h的话,就会报错!

       对于使用“”来包含头文件的方式,编译器会去当前编译的代码文件路径下找。比如,MyCode.c所在目录是“D:\CCode\Test”,则编译器会去“D:\CCode\Test”寻找MyCode.h,如果找不到,就会去上述系统目录中找,如果还找不到,就会报错!

聊聊C语言的预编译指令include的更多相关文章

  1. iOS中的预编译指令的初步探究

    目录 文件包含 #include #include_next #import 宏定义 #define #undef 条件编译 #if #else #endif #if define #ifdef #i ...

  2. c语言中条件编译相关的预编译指令

    一. 内容概述 本文主要介绍c语言中条件编译相关的预编译指令,包括#define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. 二.条件编 ...

  3. C语言的预编译,程序员必须懂的知识!【预编译指令】【预编译过程】

    由“源代码”到“可执行文件”的过程包括四个步骤:预编译.编译.汇编.链接.所以,首先就应该清楚的首要问题就是:预编译只是对程序的文本起作用,换句话说就是,预编译阶段仅仅对源代码的单词进行变换,而不是对 ...

  4. C/C++中的预编译指令

    工作中遇到的: 一个头文件中的: #pragma warning(disable:4996)#pragma warning(disable:4244)#pragma warning(disable:4 ...

  5. c/c++中的预编译指令总结

    预处理指令提供按条件跳过源文件中的节.报告错误和警告条件,以及描绘源代码的不同区域的能力.使用术语“预处理指令”只是为了与 C 和 C++ 编程语言保持一致.在 C# 中没有单独的预处理步骤:预处理指 ...

  6. C:预编译指令

    预编译 关于编译 参考 关于宏定义 参考 预编译又称为预处理,是做些代码文本的替换工作处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预 ...

  7. C语言的预编译

    由"源代码"到"可执行文件"的过程包括四个步骤:预编译.编译.汇编.链接.所以,首先就应该清楚的首要问题就是:预编译只是对程序的文本起作用,换句话说就是,预编译 ...

  8. C++ 内置宏定义 与 预编译指令

    内置宏和预编译指令, 在代码调试.单元测试.跨平台代码中经常会用到.这里记录一下. 1. 内置宏 (文件名,当前行号,当前日期,当前时间,当前执行方法名) __FILE____LINE____DATE ...

  9. Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma checksum(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#pragma checksum(C# 参考) 1.返回顶部 1. #pragma checksum(C# 参考) 2015/0 ...

随机推荐

  1. MFC应用程序配置不正确解决方案(manifest对依赖的强文件名,WinSxs是windows XP以上版本提供的非托管并行缓存)

    [现象] 对这个问题的研究是起源于这么一个现象:当你用VC++2005(或者其它.NET)写程序后,在自己的计算机上能毫无问题地运行,但是当把此exe文件拷贝到别人电脑上时,便不能运行了,大致的错误提 ...

  2. linux安装脚本

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  3. Win8Metro(C#)数字图像处理--2.13Roberts边缘检测

    原文:Win8Metro(C#)数字图像处理--2.13Roberts边缘检测  [函数名称] 图像Roberts边缘检测函数RobertEdgeProcess(WriteableBitmap s ...

  4. Win8Metro(C#)数字图像处理--2.4图像颜色聚类

    原文:Win8Metro(C#)数字图像处理--2.4图像颜色聚类  [函数名称] 图像颜色聚类函数ClusterProcess(WriteableBitmap src,int value) [算 ...

  5. Caliburn.Micro 自定义View和ViewModel的匹配规则

    使用TypeMappingConfiguration类 //Override the default subnamespaces var config = new TypeMappingConfigu ...

  6. PRML Chapter2

    参考文献:PRML2 参数方法和非参数方法 机器学习上的方法分为参数方法(根据先验知识假定模型服从某种分布,然后利用训练集估计出模型参数,也就弄清楚了整个模型,例如感知器)和非参数方法(基于记忆训练集 ...

  7. c# HttpWebRequest https的一些处理

    先看下请求方法 public string Get_Request( string strUrl, CookieContainer _cookie = null, string strHost = & ...

  8. java-mysql(2) Prepared statement

    上一篇学习了java如何链接配置mysql,这篇学习下java如何处理sql预处理语句(PreparedStatement),首先是一个sql预处理的例子: package core; import ...

  9. PHP/JS中获取当前页面的完整URL

    javascript实现: top.location.href 顶级窗口的地址this.location.href 当前窗口的地址 php实现 PHP实现 #测试网址: http://localhos ...

  10. 怎么看待php 面向对象思想

    面向对象的程序设计思路是现代程序设计由面向过程演变面向对象的必然趋势,所以面向对象的而设计思路必然有它不同的时代意义,必然有着不同面向过程的不同历史使命,而php 5以后成功添加面向对象的设计思路其实 ...