我想将我的程序分成多个文件
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
文件吗?
谢谢!
答案 0 :(得分:2)
首先 - 您不必#include "functions.c"
中的main.c
- definitions.h
中已存在定义。一般来说,您应该避免包含其他源文件。
其次 - 您#include
文件中可能没有definitions.h
- 警卫,这会导致此问题,因为您在functions.c
和definitions.h
中都包含main.c
和functions.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.c
和definitions.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(最后一个,除非你在实际的标题中错过了一个)并且没有任何内容被包含两次。