簡體   English   中英

將程序分為多個文件-出現錯誤“重新定義; 不同的基本類型”

[英]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.hfunctions.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.cdefinitions.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.hfunctions.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM