我检查了SO的重复,但无法找到我的问题的确切解决方案.
我有一个头文件NvCommon.h,我使用枚举NV_DATA_TYPE.这个枚举在另一个标题NvDefs.h中定义,我在其中使用了许多结构和枚举NvCommon.h.由于循环依赖,我无法构建它.我知道转发声明枚举是不可能的.
在这种情况下可以做些什么?这是我设计的问题吗?我是否必须引入另一个头文件来解决这个问题?
我不是C专家.请帮我.我的设计可能有问题,我知道可以通过引入另一个头文件来修复此循环依赖.我想知道的是"这是唯一的方法".寻找备用解决方案(如果有).
如果它有用,我会发布完整的代码.
如果我正确理解你的问题,你会得到这样的结论:
derpfoo.h:
#ifndef DERPFOO_H
#define DERPFOO_H
#include "derpbar.h"
typedef struct {
char *nothing;
} FOO;
BAR foo (BAR derp) {
return derp;
}
#endif
Run Code Online (Sandbox Code Playgroud)
derpbar.h:
#ifndef DERPBAR_H
#define DERPBAR_H
#include "derpfoo.h"
typedef struct {
char *nothing;
} BAR;
FOO bar (FOO derp) {
return derp;
}
#endif
Run Code Online (Sandbox Code Playgroud)
然后是一个简单的derp.c:
#include "derpfoo.h"
#include "derpbar.h"
int main (void) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的一个朋友刚才在一些SDL代码中向我提出了这个问题,我花了一段时间来理解他为什么要做他正在做的事以及如何合理地解决它.
像这样分离代码的意图是derpfoo和derpbar在逻辑上是分开的,但它们也可能是相互依赖的.我发现这样一个最简单的解决方案就是将它们组合起来并根据解剖而不是逻辑分割它们:
derpstructs.h:
#ifndef DERPSTRUCTS_H
#define DERPSTRUCTS_H
typedef struct {
char *nothing;
} FOO;
typedef struct {
char *nothing;
} BAR;
#include "derpfunctions.h"
#endif
Run Code Online (Sandbox Code Playgroud)
derpfunctions.h:
#ifndef DERPFUNCTIONS_H
#define DERPFUNCTIONS_H
#include "derpstructs.h"
BAR foo (BAR derp) {
return derp;
}
FOO bar (FOO derp) {
return derp;
}
#endif
Run Code Online (Sandbox Code Playgroud)
还是一个简单的derp.c:
#include "derpstructs.h"
#include "derpfunctions.h"
int main (void) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意,derpstructs.h包括derpfunctions.h 在结尾而不是在开头.严格来说,这不是必需的,但是如果您打算让它们相互包含,则必须在所有可能的包含路径中包含它们所依赖的结构定义之后的函数定义.继续...
这个解决方案有效,但它并没有完全坚持导致问题开始的原始理念 - 这两个部分在逻辑上是分开的,应该在代码中保留.
两者的答案是进一步分解所有内容,并进一步调整包含路径.
derpfoostructs.h包括derpbarstructs.h 第一,然后定义结构FOO,然后在端部可选地包括derpfoofunctions.h和derpbarfunctions.h.
derpbarstructs.h包括derpfoostructs.h 第一,然后定义结构BAR,然后在端部可选地包括derpfoofunctions.h和derpbarfunctions.h.
derpfoofunctions.h包括derpfoostructs.h和derpbarstructs.h 第一,然后包括derpbarfunctions.h,然后定义其功能.
derpbarfunctions.h包括derpfoostructs.h和derpbarstructs.h 第一,然后包括derpfoofunctions.h,然后定义其功能.
derp.c包括derpfoostructs.h和derpbarstructs.h ,然后包括derpfoofunctions.h和derpbarfunctions.h,然后继续做其他需要做的事情.
这满足了两个期望的要求.它消除了循环依赖性,并且仍然保持两个逻辑上独立的代码单元的逻辑分离.当您从一个项目更改为一个项目而不是一个项目时,您将获得两个要编辑的文件,但它至少使可变代码与不可变的代码保持一致.那是,这是我找到的唯一解决方案.
希望这有帮助.祝你的项目好运.