带标题的C循环依赖

时间:2018-12-06 18:15:42

标签: c

我正在从事一个项目,在该项目中,我必须遵循有关文件组织的准则,但无法对其进行编译。

为简化起见,我有一个main.h,我必须在其中定义bool和一些与之配套的符号:

#ifndef main_h
#define main_h

#include <stdio.h>
#include "test.h"

typedef unsigned char    bool;
#define TRUE  1
#define FALSE 0

#endif /* main_h */

然后main.c必须使用类型“ num_seconds_t”和函数“ test()”,这两者都必须位于与main分开的文件中。

所以我有考试。

#ifndef test_h
#define test_h

#include <stdio.h>
#include "main.h"

typedef int32_t num_seconds_t;
bool test(num_seconds_t var);

#endif /* test_h */

和我的测试。c:

#include "test.h"

bool test(num_seconds_t var){
    num_seconds_t test = var;
    return TRUE;
}

我认为main.c在此问题上不会有任何影响。

该错误表明我的test.h文件中存在未知类型“ bool”,并且我有点理解为什么当它在main.h中命中包含“ test.h”的包含内容时,它会先遍历该文件在main.h中定义了bool,则由于main.h在test.h中命中“ #include” main.h“”时具有“ #ifndef main_h”,因此它会跳过并继续读取,因此直到测试之后bool才被定义.h已完成读取。

我不确定我的理解是否正确,但是解决此问题的正确方法是什么。通过简单地将“ #include” test.h“”移到bool的定义之后,它将进行编译,但是在我的大项目中,我有许多文件交织在一起,并且协调包括这些文件的顺序将非常困难,即使不是不可能。

谢谢

1 个答案:

答案 0 :(得分:2)

我将提出3种解决方案:

1)最好的选择是不要#include中的test.h main.h,因为您不需要test.h中的main.h中定义的任何内容(您可以确实需要test.hmain.c中的内容,因此test.h应该在#includemain.c)。如注释中所述,这通常是一种好习惯(您不想#include不需要的东西)。

2)您的第二个最佳选择是将内容从test.hmain.h移到另一个文件。在这种情况下,您希望将typedef#define移到另一个文件中,如下所示:

typedef unsigned char bool;
#define TRUE  1
#define FALSE 0
typedef int32_t num_seconds_t;

,然后将此文件包含在main.htest.h中(或仅包含在test.h中,因为`main.h不需要这些typedef)。

3)最后也是最糟糕的选择是仔细选择包含事物的顺序。这是您最糟糕的选择,因为它在大型项目中变得非常笨拙,但尽管如此,我还是会展示它。

将所有其他文件保持不变并执行以下操作:

// main.c

#include test.h

作为main.c中的唯一包含项将解决您的问题。当您尝试对此进行编译时,在test.h中仅#includemain.c编辑。然后,这将包括main.h,该类型具有test.h所需的typedef。 main.h将不再包含test.h,因为已经包含了它。没关系,因为main.h实际上不需要test.h

您还可以将#include中的main.h移动到typedef下方,并将main.h包含在main.c中。但是,正如我提到的那样,选项3不是一个好的选择。

您确实应该对选项1和2进行某种组合(通常,不仅仅针对此项目)。