2014-01-12 47 views
2

我是C++編碼的新手,這是我在Stack Overflow上的第一篇文章。錯誤C2084'函數已經有一個身體'

我編碼在Visual C++基於文本的比賽,我已經得到C2084錯誤在此文件:

//game_system_functions.cpp 
#include "basicdefines.h" 

namespace 
{ 
    using namespace std; 

    void clear_console() 
    { 
     if (system("CLS")) system("clear"); 
    } 
} 

我覺得這很奇怪,因爲它只有在文件發生。所有其他.cpp文件對函數沒有任何問題,它們都處於類似的格式。

我已經檢查並雙重檢查了我的所有代碼,並且沒有其他函數調用clear_console。我試着將函數重命名爲一堆隨機字母,而且我仍然得到相同的錯誤。同一個.cpp文件中的其他函數也會出現類似的錯誤。這個問題在過去一週一直困擾着我,我無法解決它。

我已閱讀其他職位關於error C2084,他們沒有這個問題。 我將不勝感激這個錯誤的一些幫助。

謝謝。

P.S.我對任何格式問題表示歉意,正如我之前在帖子中所說的那樣,這是我第一次發佈堆棧溢出問題,如果標題有點不明確,我很抱歉。

+0

你曾經包含這個文件嗎? – chris

+0

可能他沒有考慮它是一個cpp文件。 – BWG

+0

爲我編譯好。除此之外,如何在匿名命名空間中使用函數? – Paranaix

回答

8

OP:

我打算它來容納所有的字符串和控制檯操作功能爲整個遊戲,所以幾乎在程序中的每個文件都包含它

這就是問題所在。它的一個.cpp文件不是.h。它實際上包含符號的定義。 如果你現在包含這個文件,那麼你也可以包含一些其他的文件,包括這個文件。

會發生什麼事是,在這樣的預處理單元代碼中出現:

void clear_console() 
{ 
    if (system("CLS")) system("clear"); 
} 

void clear_console() 
{ 
    if (system("CLS")) system("clear"); 
} 

錯誤消息是有道理的現在,那並不呢? 要解決這個問題,您必須使用header guard

或更好的,修復您的文件結構:永遠不應該包含.cpp。取而代之的是創建一個頭文件,例如void clear_console();。在.cpp然後你執行功能就像你已經做的,但你只包括頭文件(.h)文件。

另外請注意,這是匿名命名空間的可能,但他們在這裏沒有任何意義。所以只需使用一個常規/命名的命名空間或擺脫它。

+0

這樣做總的感覺,我現在試試 – FuNK01

+0

這很有效,非常感謝你!正如我所說的,我是C++的新手,所以這似乎是一個明顯的錯誤。我已經修復了我的代碼,並且它可以工作。謝謝! – FuNK01

2

您確實有一個單獨的.h文件對應於此.cpp文件,不是嗎?

如果不是,而您在其他文件中嘗試和#include "game_system_functions.cpp",則會出現問題,因爲您的.cpp文件沒有標頭警衛。

如果要包括一個文件到別人,你應該有頭衛士是這樣的: -

#ifndef GAMESYSTEMFUNCTIONS_H 
#define GAMESYSTEMFUNCTIONS_H 
... 
... function declarations, etc.. 
... 
#endif 
+0

真正的包括守衛是好的,但他們不會爲功能聲明有所作爲。它主要用於類定義,但仍然是一個很好的習慣。 – chris

+0

@chris完全錯誤 – Paranaix

+0

@chris它們將對函數*定義有所不同,這就是我們在這裏所做的。然後鏈接程序將決定使用哪個定義,但我認爲他們通常能夠做到這一點。這將是一個單獨的問題。 – Roddy

相關問題