![](/img/trans.png)
[英]error C2371: 'functionname' redefinition: different basic types
[英]Breaking program into multiple files - getting error “redefinition; different basic types”
我想將程序分成多個文件
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
C2371: 'MyStruct' : redefinition; different basic types
(這是Visual Studio)
現在,我不知道為什么會出現此錯誤! 謝謝 !
所以你建議做以下事情
main.c
放入#include "definitions.h"
(帶有typedef和#define和函數頭)
現在,我如何告訴編譯器它需要查看functions.c
文件中的函數定義?
我應該將#include "functions.c"
放到definitions.h
文件中嗎?
謝謝 !
首先-您不必在main.c
#include "functions.c"
-定義已經存在於definitions.h
。 一般來說,應該避免包含另一個源文件。
其次-您的definitions.h
文件中可能沒有#include
-guards,這將導致此問題,因為您同時在main.c
中包含了functions.c
和definitions.h
,而functions.c
包含了definitions.h
作為好,這將導致多重定義的瘋狂。
/* include guards */
#ifndef definitions_h_
#define definitions_h_
/* all of definitions.h content */
#endif
編輯
此外,根據您使用的編譯器,您也許可以使用更簡單的#pragma once
指令。 Visual C ++支持此功能,最近(> 3.4)的GCC版本也支持。
如我的評論所建議,您的第一個問題是您包括一個源文件。 您僅包括標頭,因此原型就在其中,並且代碼可以編譯,但您不包括其他代碼文件-這些文件是分開編譯的。 這樣做不會破壞單獨編譯的唯一優勢,即重新編譯更快,因為每次編譯之間只有幾個源文件發生更改,並且無需重新編譯未更改的文件,因為.obj文件仍然存在。
解決此問題,您的問題應該消失。 但並非永遠如此,只要項目規模如此之小,而且您不會多次包含任何內容。 每個標頭文件(包括的每個文件-但這僅僅是標頭)都必須具有“ include Guard”,以防止多次包含該文件(請記住, #include "file"
僅表示“在此處粘貼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
,有些人更喜歡#endif //UNIQUE_HEADER_NAME_H
)。 因此,當首次包含文件時, UNIQUE_HEADER_NAME_H
,因此將文件作為普通文件包含在內, 並定義了UNIQUE_HEADER_NAME_H
。 它包含在接下來的時間, UNIQUE_HEADER_NAME_H
已經definded,因此預處理器跳到相匹配的ENDIF(一底,除非你錯過了一個在實際的頭)沒有東西包含了兩次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.