zoukankan      html  css  js  c++  java
  • 项目.c文件和.h文件关系

                "如有不正确之处,请指出,谢谢"       --Mood

    对于一个项目,我们应该要很好的处理众多的.c和.h文件.

    1.通过头文件调用库功能:#include <stdio.h>  
       
    在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。

    2.人为定义的.h文件:#include "avformat.h"

    一般提供了结构体的声明或者定义,函数的声明.枚举的声明或者定义.宏变量的定义等.
    而其定义是在.c文件中实现.

    自定义的两种情况:
     

    假定编译程序编译 D.c(其中含main())时,发现它include了 A.h(其中声明了某一函数),那么此时编译器将按照事先设定的路径( Include路径列表及代码文件所在的路径)查找该函数定义.
    1.在当前目录找到了与之同名的 A.c文件,在其中找到该函数定义,继续编译.
    2.在当前目录找到了与之同名的 A.c文件,在其中没有找到函数定义,然后查找 A.c文件include的其它.h文件相对应的.c文件.若找到函数定义,继续编译.
    3.在当前目录未找到与之同名的 A.c文件,则查找A.h中include的其它.h文件向对应的.c文件,若找到函数定义,继续编译.
    4如果都没有找到此函数定义,则返回一个编译错误.

    include的过程完全可以“看成”是一个文件拼接的过程


    若想了解其查找过程,应该去了解编译器的工作原理.


    在一个项目中,会有.h文件被多次引用,这样.h文件就会被放到多个.c文件中被多次编译,我们要尽量避免这样的多次声明.从而提高效率.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    A.h
    int a();
     
    B.h
    #include "A.h"
     
    C.h
    #include "A.h"
     
    D.h
    #include "A.h"
    #include "B.h"

    上面的D.h文件中就会重复出现两个int a();的声明阿,这样就有点重复了,这时条件编译宏就派上了用场

    1
    2
    3
    4
    5
    
    A.h
    #ifndef A_H
    #define A_H
    int a();
    #endif

    这样就不会重复定义了。


  • 相关阅读:
    【POJ 1958】 Strange Towers of Hanoi
    【HNOI 2003】 激光炸弹
    【POJ 3263】 Tallest Cow
    【POJ 2689】 Prime Distance
    【POJ 2777】 Count Color
    【POJ 1995】 Raising Modulo Numbers
    【POJ 1845】 Sumdiv
    6月16日省中集训题解
    【TJOI 2018】数学计算
    【POJ 1275】 Cashier Employment
  • 原文地址:https://www.cnblogs.com/riskyer/p/3268620.html
Copyright © 2011-2022 走看看