C--->C語言重復定義的問題


大綱

  • 頭文件的作用
  • 驅動文件和頭文件中該存放什么內容
  • 如何防止重復定義
  • 頭文件使用案例

 

1.頭文件的作用

      (1) 為其他驅動文件(.c)或者頭文件(.h)調用相關函數、結構體、數組、全局變量等

      (2)最常用的就是調用API接口(openCV、QT中的相關模板)


2. 驅動文件和頭文件中該存放什么內容?

  •    驅動文件(.h)存放對外調用的函數,數組、結構體、變量等申明(全局變量extern)
  •    頭文件(.c)存放  定義函數、數組、結構體、變量的初始化等等,static函數或變量。
  • 注:一般不要在頭文件中定義變量、函數、類,否者容易產生重復定義

3.如何防止重復定義

     重復定義是調用別人的庫函數時變量被重新申明。

     如:   在a.h 中申明變量  extern int a;

               在b.h 中申明變量 extern int a;

    這時候: 在c.c中調用 a.h  和 b.h , 就會出現     xxxx  has been  defined .

    

頭文件使用案例(1):不涉及重復定義

   //a.c

   //#include<stdio.h>

     void print(void)

   {

         printf(“test\n”);

   }

   //a.h

   extern  void print(void);

  

   //b.c

   #include<a.h>

      main()

  {

         print();

   }

after compiled, print test.

頭文件使用案例(2):涉及重復定義

     我們在使用頭文件定義時候,如定義結構體在頭文件中定義,在頭文件中申明全局

或者在驅動文件中定義,在頭文件中申明全局變量。

      本案例定義結構體變量,然后初始化結構體,然后在主函數中調用結構體函數實現相應功能。

//1.struct.h

#ifndef   __a_H_

#define  __a_H_

   typedef struct 

{

     unsigned char i;

     unsigned char u;

     unsigned char v;

} check;

#endif


//2.  xxx.c

初始化結構體

 #include<struct.h>

void initalstruct(check* AAA)

{

       AAA->i =3;

       AAA->u =4;

       AAA->v =5;

}

//  xxx.h

extern void initalstruct(check* AAA);


#include<stdio.h> 

#include<struct.h>  //定義結構體

#include<xxx.h>      //調用結構體初始化函數

    int main()

  {

        check check1;

      initalstruct(&check1);

      printf(“%d\n”,check1.i );

   }

 

拖延讓你失去很多,並且那些是再也回不去的昨天。

初心 initial heart start in 2021 11 10

Date:2021-11-10


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM