2017-02-14 141 views
0

我在我的項目中的一個名爲Fares.cpp的文件中初始化了一些數組。當我在Dev-C++的main.cpp文件(其中項目的主代碼是)中嘗試使用#include "Fares.cpp"時,編譯器給出了一個錯誤,指出「多重定義」。我不知道該怎麼做,請幫忙。 我對宏,extern等知之甚少Dev-C++中的多重定義錯誤

+0

只有頭文件('.h','.hpp'等)應被包括在內。如果您想要更具體的答案,請告訴我們您的代碼。 – Melebius

+2

http://c-faq.com/cpp/hfiles.html – melpomene

回答

2

嘗試包括"Fares.h"而不是"Fares.cpp"#include通常用於包含頭文件,其中通常包含變量聲明和函數原型。點擊此鏈接瞭解更多信息:http://www.learncpp.com/cpp-tutorial/19-header-files/

+0

它說,不存在所謂的Fares.h這樣的文件。作爲項目文件被保存爲fares.cpp – Agni

+0

你可以寫你的電子郵件我會發送你整個項目,你試着運行它,看看問題是什麼。如果u不想在這裏寫下烏爾電子郵件u能在[email protected] – Agni

+0

給我發送郵件假,我會向您發送電子郵件 – Algorithmic

2

傳統上,.c和.cpp文件與編譯單元(模塊等)有關,由編譯器單獨處理。包括旨在將名爲「頭文件」或「包含文件」的文件添加到文件範圍,使聲明,內聯函數定義和類型定義在其中可用於編譯器的語法分析器。 聲明包括:

  • 函數聲明
  • 模板聲明
  • 顯式模板實例
  • 顯式模板特
  • 命名空間定義
  • 聯動說明書
  • 屬性聲明(ATTR;)(自C++ 11)
  • 空聲明(;)(因爲C++ 11)

爲了避免相同的類或功能的多個定義,頭文件必須使用的#ifndef塊作爲 「括號」

// beginning of file.h 
#ifndef SOME_UNIQUE_ID 
#define SOME_UNIQUE_ID 

// declarations , etc. 

#endif 
// end of file .h 

沒有什麼防止使用不同的後綴,這是構建過程如何組織的問題。有一個共同的協議來命名C文件.c,C++ - .cpp,標準C++頭文件根本沒有後綴,而所有其他頭文件可能有.h或.hpp。包含僅包含內聯函數的文件有時會被賦予.inc或.inl後綴,而不是.h,但這並不是以任何方式被調節,據我所知

您可以在同一範圍內只有一個定義ID。即使您可能有多個文件作用域,更多的是,對於每個.cpp文件,非靜態聲明都會生成會導致鏈接時錯誤的重複ID。你真的應該避免使用.cpp作爲包含文件,因爲在大多數構建環境中,編譯器會嘗試多次鏈接它 - 對於#include中的每個用途以及作爲單獨的模塊。

在你的情況,你應該把你的數組聲明爲.h文件中在形式上是這樣的:

// fares.h 
#ifndef FARES_H_ 
#define FARES_H_ // this will not allow declaration to be repeated 

extern int gYourGlobalArray[100]; 

#endif 

字的extern會告訴該符號在其他地方定義,並會在鏈接階段找到的編譯器,對象應該是靜態或線程存儲時間,這在我們的情況下是正確的,因爲我們聲明瞭全局變量,並獲得外部鏈接。 Fares.cpp將有「實現」,它必須包含不會重複的符號。

// Fares.cpp 
#include "fares.h" // necessary only if you require something declared there 
// keep in mind that some file systems are case sensitive, some aren't and 
// will not distinguish between Fares.h and fares.h 

int gYourGlobalArray[100] = {}; 

這實際上定義了您的數組在文件範圍內的線程持續時間存儲並允許它在外部連接。在整個項目中,它的標識應該是唯一的(C++編譯器會破壞一些對象的名稱,例如函數,但通常應該避免重用ID)。如果出於某些野性原因,文件範圍中的ID在不同的文件中重複但不應該在外部鏈接,則應該聲明這樣的存儲static,這將禁止外部鏈接。

聲明類的靜態成員通常要麼需要在cpp文件(無關鍵字static)類似的定義或需要類體中的初始化,提供編譯器支持。

接下來,你應該只添加fares.cpp,無論你正在使用的編譯環境項目\ makefile文件\。 fares.h將#include語句放入需要它的.cpp或.h文件中。技術上講,#include語句只是將提到的文件的文本添加到文件中,正好在該位置中。

+0

所以什麼ü的意思是我應該寫的#ifndef在開始票價和#definese票價Fares.cpp文件的?在主文件中,我應該聲明#include「Fares.h」?? – Agni

+0

它沒有工作我試過 – Agni

+0

ü可以寫電子郵件烏爾我會送U整個項目,U試着運行一下,看看是什麼問題。如果你不想在這裏寫下你的電子郵件,你可以發郵件給我[email protected] – Agni