2013-08-04 68 views
0

我有一個頭文件和5個不同的C++文件,我需要將此頭文件包含在所有的C++文件中。與包括我並沒有宣佈任何cpp文件「x.cpp」任何人都知道我是如何解決這個問題?(我有6頭和5 CPP在總讓我沒有C/P的所有代碼。)找到一個或多個乘法定義的符號C++

#ifdef _DEBUG 
#ifndef _UTIL_H_ 
#define _UTIL_H_ 


int LOOPCOUNTER=0; 

int loopi; 
#define LOOP LOOPCOUNTER++; 
#define MARKLOOPS (loopi=LOOPCOUNTER); 
#define PRINTLOOPS cout<<LOOPCOUNTER-loopi; 
#define PRINTALLLOOPS cout<<LOOPCOUNTER<<endl; 

#endif 



#endif 

,這是錯誤消息:

1>linkedlistc.obj : error LNK2005: "int loopi" ([email protected]@3HA) already defined in arraylistc.obj 
1>linkedlistc.obj : error LNK2005: "int LOOPCOUNTER" ([email protected]@3HA) already defined in arraylistc.obj 
1>main.obj : error LNK2005: "int loopi" ([email protected]@3HA) already defined in arraylistc.obj 
1>main.obj : error LNK2005: "int LOOPCOUNTER" ([email protected]@3HA) already defined in arraylistc.obj 
1>C:\Users\Eko\Documents\Visual Studio 2010\Projects\mt1\Debug\mt1.exe : fatal error LNK1169: one or more multiply defined symbols found 
1> 
+0

包括確切的錯誤消息和有問題的聲明會有幫助。 –

+0

您已經明確定義了標題中的一個或多個符號,因此多次包含該標題會導致多個定義。包括警衛不會幫助 - 他們會阻止在同一個源文件中多次包含頭文件,但不會像您在這裏一樣處理鏈接問題。 –

+0

以下劃線後跟大寫字母(_UTIL_H_)開頭的名稱和包含兩個連續下劃線的名稱保留給實施。不要使用它們。 –

回答

0

假設你得到關於符號鏈接的投訴,您的問題可能是,你的頭獲得包括多次。你不應該讓這種情況發生。

典型的解決方案是使用包括後衛是這樣的:

#ifndnef MYHEADER_H 
#define MYHEADER_H 

//header code here 

#endif 

這將確保你的頭實際上只被包括一次。

此外,你不應該#include cpp文件,只有標題。另一方面,如果包括守衛沒有幫助,那麼你有頭文件定義符號,而不是聲明它們。不要這樣做。請參閱this question瞭解如何處理全局數據,而不用在頭文件中定義它。

+0

以下劃線後跟大寫字母(_MYHEADER_H)開頭的名稱和包含兩個連續下劃線的名稱保留給實施。不要使用它們。 –

+0

@PeteBecker編輯,我有一個忘記單下劃線名字的壞習慣。 – DUman

+0

@ user1264727 - 很多人都這樣做,這就是爲什麼我有一個相當的罐頭提醒... –

2

我認爲頭文件必須只有變量的聲明。你應該把定義放到合適的cpp文件中。 類似這樣的:

// header file 
#ifndef _UTIL_H_ 
#define _UTIL_H_ 

extern int LOOPCOUNTER; 

#endif 

// cpp file 
// ... 
int LOOPCOUNTER = 0; 
+1

或使它'靜態'。 – 2013-08-04 15:35:50

+0

以下劃線後跟大寫字母('_UTIL_H_')開頭的名稱和包含兩個連續下劃線的名稱保留給實施。不要使用它們。 –

+0

@James Sure,但這取決於用戶的目標。每個文件的靜態變量都是「本地」的,不是嗎? – Unforgiven

相關問題