我正在从事一个项目,在该项目中,我必须遵循有关文件组织的准则,但无法对其进行编译。
为简化起见,我有一个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的定义之后,它将进行编译,但是在我的大项目中,我有许多文件交织在一起,并且协调包括这些文件的顺序将非常困难,即使不是不可能。
谢谢
答案 0 :(得分:2)
我将提出3种解决方案:
1)最好的选择是不要#include
中的test.h
main.h
,因为您不需要test.h
中的main.h
中定义的任何内容(您可以确实需要test.h
中main.c
中的内容,因此test.h
应该在#include
中main.c
)。如注释中所述,这通常是一种好习惯(您不想#include
不需要的东西)。
2)您的第二个最佳选择是将内容从test.h
和main.h
移到另一个文件。在这种情况下,您希望将typedef
和#define
移到另一个文件中,如下所示:
typedef unsigned char bool;
#define TRUE 1
#define FALSE 0
typedef int32_t num_seconds_t;
,然后将此文件包含在main.h
和test.h
中(或仅包含在test.h
中,因为`main.h不需要这些typedef)。
3)最后也是最糟糕的选择是仔细选择包含事物的顺序。这是您最糟糕的选择,因为它在大型项目中变得非常笨拙,但尽管如此,我还是会展示它。
将所有其他文件保持不变并执行以下操作:
// main.c
#include test.h
作为main.c
中的唯一包含项将解决您的问题。当您尝试对此进行编译时,在test.h
中仅#include
被main.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进行某种组合(通常,不仅仅针对此项目)。