Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 循环包含依赖导致的麻烦,如何解决?_C_Include - Fatal编程技术网

C 循环包含依赖导致的麻烦,如何解决?

C 循环包含依赖导致的麻烦,如何解决?,c,include,C,Include,我有两个头文件需要(?)包含彼此 第一个 校长1.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 fun

我有两个头文件需要(?)包含彼此

第一个

校长1.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
#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依赖性引起的吗?如果是这样,我该如何解决它呢?

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

  • 定义
    HEADER2\u H
  • 包括
    header1.h
  • 定义
    HEADER1\u H
  • 包括
    header2.h
    ,但由于已经定义了
    header2\u h
    ,因此这在很大程度上是不可操作的
  • 现在回到
    header1.h
    编译器遇到
    void函数(MyStruct\t参数)
  • 此时未定义
    MyStruct\t
    ,因为尚未处理
    header2.h
    ,因此会出现指定的编译器错误

    不幸的是,由于循环依赖性,实际上没有办法用定义的头文件中的代码来解决这个问题

    • header1.h
      取决于
      header2.h
    • header2.h
      取决于
      partialstruct
      的全面实施,即
      header1.h

    为了解决此问题,您需要切换其中一个头文件以使用指针,或者创建第三个头文件,
    header0。
    h包含
    partialstruct\t

    的定义,将partialstruct\t排除到另一个头文件中并没有为我解决此问题:/@Zaibis您是否更新了包含顺序以反映新的细分?@Zaibis两个header2都应该包括header0,header1应该包括header0和header2。header0需要一个嵌套的转发声明,虽然我现在把所有的typedef都放到header1中,并在header2中做了一个注释typedef,并注明在哪里可以找到它们,而且以不同的方式是不可能的。无论如何,感谢您的帮助。如果两个标题/库/模块/任何东西相互依赖,那么从一开始就将它们分开可能是一个错误。但有时它们的使用意图在主题上完全不同。从干净代码的角度来看,也看这个主题并不是一个错误。