2013-04-10 102 views
1

我工作的一個C項目,並正嘗試使用預處理器後衛如可以在C++中使用:C預處理器警衛?

#ifndef CONFIG_H 
#define CONFIG_H 

... exciting stuff in C .... 

#endif 

包括這在我的源似乎在Visual Studio中沒有效果,因爲當我包括給定的文件,如Config.h,在多個文件中,編譯器給了我以下錯誤:

1>main.obj : error LNK2005: _OPCodes already defined in lib.obj 
1>main.obj : error LNK2005: _OPTotal already defined in lib.obj 
1>main.obj : error LNK2005: _RegCodes already defined in lib.obj 
1>main.obj : error LNK2005: _RegTotal already defined in lib.obj 
1>main.obj : error LNK2005: _UDSTotal already defined in lib.obj 

誰能給我任何指針(沒有雙關語意)這一點,好嗎?

+3

'#define CONFIG_G'應該是'#define CONFIG_H' – maditya 2013-04-10 06:55:52

+0

@maditya對不起,這是早上3點,這是我的文章中的一個錯字。現在修復,仍然無法正常工作。 – 2013-04-10 07:09:50

+0

當你說「在我的源代碼中包含這個」時,你的意思是你把include guard放在頭文件中,而不是在'.cpp'文件中,對吧?無論如何,請嘗試將'#pragma once'放在那裏,以查看會發生什麼。 – 2013-04-10 07:23:16

回答

8

警衛會阻止在編譯單元中定義兩次。他們不會阻止在不同的編譯單元中定義相同的事物。並且鏈接器消息指示發生了什麼_OPCodes例如在libmain中定義。

通常,一個頭文件應該只有函數和全局變量的聲明,相應的定義將在其中一個源文件中提供。

(例如見What is the difference between a definition and a declaration?獲取更多信息)

+0

謝謝你是我的問題的答案。我(愚蠢地)在我的'.h'文件中定義了一些東西。將它們移到'.c',我的問題就消失了。 – 2013-04-10 07:32:17

4

編輯:這是根據原來的職位,其中有一個錯字。顯然,這不是OP的真正問題。

你給了你的衛兵兩個不同的名字。他們必須匹配。

#ifndef CONFIG_H 
#define CONFIG_H // not CONFIG_G! 
+0

對不起,今天早上3點,這是我的帖子中的一個錯字。現在修復,仍然無法正常工作。 – 2013-04-10 07:08:24

+0

嘗試添加'#pragma once'只是踢,看看是否修復它。如果沒有,那麼你的問題不在這個頭文件中。如果是這樣,你可能會讓你的'#endif'出現在錯誤的地方或一些這樣的事情上。無論如何,添加'#pragma once'都不會傷害任何東西,它只是加速了編譯過程。 (雖然可能不是) – 2013-04-10 07:13:19

+0

謝謝,但這是不行的。 – 2013-04-10 07:24:18

2
#ifndef CONFIG_H 
#define CONFIG_G 

... exciting stuff in C .... 

#endif 

它,因爲一個錯字你得到「已經定義錯誤」

在您所定義CONFIG_G而不是CONFIG_H你的頭文件,所以從下一個源文件中的#ifndef CONFIG_H是真的,所以它再次包含相同的內容

+0

對不起,今天早上3點,這是我的帖子中的一個錯字。現在修復,仍然無法正常工作。 – 2013-04-10 07:09:19

0

如果您已重命名的文件,則應該從解決方案中刪除,並重新添加。有時Visual Studio有點奇怪,他們會在離開時導致鏈接器錯誤。

請確保重建。

您可能還意外地包含了.cpp文件而不是.h文件。爲了以防萬一,請仔細檢查所有內容。