zoukankan      html  css  js  c++  java
  • 聊聊C语言的预编译指令include

    “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 ", 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 ", 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 ", b);
        return 0;
    }

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

     

     
           这次编译中,由于MyCode.h没有做任何修改,而且之前也已经编译过一次,因此,MyCode.h本次不会再次编译。但是main函数中做了修改,因此,main函数部分会再次编译, 这就省去了MyCode.h的编译时间。试想,如果MyCode.h中有很多的函数声明,很多的函数实现,很多的变量、常量定义,很多的宏,MyCode.c中也包含了很多的头文件,那么,只要预编译一次这些头文件,以后不管怎么修改main函数,再次编译时,是不是能够省去很多的时间?这就是预编译的好处。当然,如果头文件也被修改了,那么头文件还是要重新编译的。
           说到这里,有人可能发现了,代码中有#include <stdio.h>和#include "MyCode.h",头文件一个用<>包含,一个用“”包含,两者有什么区别呢?
           对于使用<> 来包含头文件的方式,编译器会去系统目录中寻找头文件,而这个系统目录的位置,可以由你手动配置,也可以由编译器默认。比如,在VC中的配置方式如下:

     
           这里指明了头文件在“D:softwaresMicrosoft Visual StudioVC98”位置,这是VC安装时默认指定的。而“D:CCodeMySQLmysql-5.6.24-win32include”是我安装MySql时,我自己配置的。如果编译器在上述目录中都找不到头文件stdio.h的话,就会报错!
           对于使用“”来包含头文件的方式,编译器会去当前编译的代码文件路径下找。比如,MyCode.c所在目录是“D:CCodeTest”,则编译器会去“D:CCodeTest”寻找MyCode.h,如果找不到,就会去上述系统目录中找,如果还找不到,就会报错!
  • 相关阅读:
    java操作生成jar包 和写入jar包
    jboss配置jndi连接池
    windows 域的LDAP查询相关举例
    LDAP error Code 及解决方法
    HDU 6417
    CF1299D Around the World
    codechef Chef and The Colored Grid
    Educational Codeforces Round 82 (Rated for Div. 2)
    CF1237F Balanced Domino Placements
    CF1254E Send Tree to Charlie
  • 原文地址:https://www.cnblogs.com/itblog/p/7236591.html
Copyright © 2011-2022 走看看