C语言中一个头文件引用另外一个头文件中的非基础类型定义的问题

在c语言中如何在一个头文件中引用另外一个头文件定义的结构体或者联合体

在定义变量的时候无意间发现在源程序中引用的头文件编译后提示重复定义的错误,找了很多资料,还是没有解决,最后在看前辈的代码时才反应过来,遂记录于此。

先看定义报错的引用

main.c

#include "define_all.h"  
#include "variable.h"  

 define_all.h  

/*联合体定义*/
typedef union
{
  unsigned char B08;
  struct
  {
    unsigned char bit0:1;
    unsigned char bit1:1;
    unsigned char bit2:1;
    unsigned char bit3:1;
    unsigned char bit4:1;
    unsigned char bit5:1;
    unsigned char bit6:1;
    unsigned char bit7:1;
  }Bit;
}B08_Bit;

variable.h

#ifndef	__VARIABLE_H__
#define __VARIABLE_H__
#include "define_all.h"



B08_Bit  DISP_statu_S;
#define disp_time_flag   DISP_statu_S.Bit.bit0


#endif

 

这个时候如果MDK开了实时语法检测就会提示类型未定义,并且编译报错,而且go to define也无法跳转。

究其原因是头文件卫士#ifndef #define#endif的问题,头文件卫士会保护该头文件不会重复定义,同样会告诉别的头文件这是一个头文件,因此这个头文件不能引用外部的复杂变量的定义。一般来说如果在头文件中定义了一些结构体或者联合体,在源文件中可以直接使用结构体或者联合体变量来定义某些变量。这时把需要把引用头文件的头文件卫士去掉,编译即可。

网上有些说法是通过外部变量extern来在头文件中声明另一个头文件中的变量,但是貌似对复杂类型的变量定义无效。(亲测)

 

经过上述处理后编译通过即可,此时新问题又来了,如下面程序所示我主程序main.c需要使用disp_time_flag这个变量我的中断interrupt.c也需要引用这个变量,如果同时包含variable.h没有了头文件卫士则会导致重复定义。

    for( ; ; )
    {       
		if(disp_time_flag )
		{
			disp_time_flag = 0;
			LcdTest();
		}

    }	
void RTC_IRQHandler()
{
	disp_time_flag = 1;
	RTC_RTCIF_ClrEx(RTC_ISR_SEC_IF_Msk);	
}

此时需要使用头文件卫士再建立一个头文件flag.h如果需要使用变量直接包含flag.h即可。

#ifndef	__FLAG_H__
#define __FLAG_H__
#include "define_all.h"




extern B08_Bit  DISP_statu_S;

#define disp_time_flag   DISP_statu_S.Bit.bit0

#endif

以上是针对MDK5.17版本及个人的理解,如有错误,欢迎指正。

你可能感兴趣的:(c语言,单片机,c语言)