将程序分解为多个文件 - 获取错误“重新定义;不同的基本类型”

时间:2010-10-17 16:02:13

标签: c visual-studio

我想将我的程序分成多个文件
1. main.c - 是主要功能
2. definitions.h - 包含#define,typedef,函数原型
3. functions.c - 包含函数(definitions.h中的原型)

在definitions.h中,我有结构 MyStruct 的typedef,用于definitions.h& functions.c

我做了以下事情:

main.c

,我有#include "definitions.h"& #include "functions.c"
functions.c中,我有#include "definitions.h"

现在,我收到错误错误C2371: 'MyStruct' : redefinition; different basic types(它是visual Studio)

现在,我无法弄清楚为什么我会收到此错误! 谢谢!


所以你建议做以下

main.c#include "definitions.h"(使用typedef& #define& function header)

现在,我如何告诉编译器它需要查看functions.c文件中的函数定义?
我应该将#include "functions.c"放入definitions.h文件吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

首先 - 您不必#include "functions.c"中的main.c - definitions.h中已存在定义。一般来说,您应该避免包含其他源文件。

其次 - 您#include文件中可能没有definitions.h - 警卫,这会导致此问题,因为您在functions.cdefinitions.h中都包含main.cfunctions.c {1}},definitions.h也包括/* include guards */ #ifndef definitions_h_ #define definitions_h_ /* all of definitions.h content */ #endif ,这会导致多重定义的疯狂。

{{1}}

修改

此外,根据您使用的编译器,您可以使用更简单的#pragma once指令。 Visual C ++支持它,最近(> 3.4)版本的GCC支持它。

答案 1 :(得分:2)

根据我的评论中的建议,您的第一个问题是您包含了一个源文件。您只包含标题,因此原型存在并且代码编译,但您不包含其他代码文件 - 这些是单独编译的。不这样做会破坏单独编译的唯一优势,更快的重新编译,因为每个编译之间只有少数源文件发生变化,因为.obj文件仍然存在,所以不需要再次编译。

解决这个问题,您的问题应该消失。但不是永远,只要项目保持那么小而且你不多次包含任何东西。每个头文件(好吧,你包含的每个文件 - 但这只是标题)必须有一个“包含守护”,这可以防止文件多次被包含(请记住,#include "file"仅表示“粘贴{{{}的内容1}}在此之前编译“) - file包括main.cdefinitions.h,但functions.c还包含functions.c,因此definitions.h的内容包含两次,因此所有类型和函数原型实际上都定义了两次 - 这是非法的。在每个头文件的最开头,添加如下内容:

definitions.h

最后,添加一个#ifndef UNIQUE_HEADER_NAME_H #define UNIQUE_HEADER_NAME_H (有些人更喜欢#endif,以便澄清)。因此,当首次包含文件时,未定义#endif //UNIQUE_HEADER_NAME_H,因此文件将被包含为正常 UNIQUE_HEADER_NAME_H被定义。并且下次包含它时,UNIQUE_HEADER_NAME_H已被定义,因此预处理器会跳到匹配的endif(最后一个,除非你在实际的标题中错过了一个)并且没有任何内容被包含两次。