循环包含依赖引起的麻烦,如何解决?

时间:2014-02-11 22:03:08

标签: c include

我有2个头文件,需要(?)互相包含。

第一个

  

那么header1.h

看起来像这样:

#ifndef HEADER1_H
#define HEADER1_H

#include "header2.h"

typedef Needed_s
{
     size_t something;
} Needed_t;

typedef partialstruct_s
{
     size_t something;
     Needed_t *pointer;
} partialstruct_t;

void function (MyStruct_t Parameter);//<- this line gets the error

#endif

第二个

  

header2.h

像这样:

#ifndef HEADER2_H
#define HEADER2_H

#include "header1.h"

typedef MyStruct_s
{
     //struct partialstruct_s ThisOne;
     //I tryed both ways!
     partialstruct_t ThisOne;
} MyStruct_t;

#endif

我不喜欢这种工作方式,但我也不喜欢在不同的标题中声明它们所涉及的相关不属于的结构。

代码只是一个MCTR所以请不要给我改进提示。

我现在收到错误:

  

header1.h:17:错误:预期声明说明符或'MyStruct_t'之前的'...'

这是由include依赖引起的问题吗?如果是这样,我该如何解决呢?

1 个答案:

答案 0 :(得分:1)

您获得的编译器错误只是在.c文件中包含header2.h的结果。这将大致执行以下步骤

  1. 定义HEADER2_H
  2. 包括header1.h
  3. 定义HEADER1_H
  4. 包含header2.h,但因为HEADER2_H已经定义,所以这主要是无操作
  5. 现在回到header1.h编译器遇到void function (MyStruct_t Parameter);
  6. 此时MyStruct_t未定义,因为header2.h尚未处理,因此您得到指定的编译器错误。

    不幸的是,由于循环依赖性,实际上无法通过定义的头文件中的代码解决这个问题。

    • header1.h取决于MyStruct_t
    • header2.h的完整实施情况
    • header2.h取决于partialstruct_t的完整实施,即header1.h

    为了解决此问题,您需要切换其中一个头文件以使用指针或创建第三个头文件header0. h,其中包含partialstruct_t的定义