2010-10-18 12 views
0

問候。試圖研究亮度MPEG Layer-III編碼器 - 獲取「C++內置類型的重新聲明'布爾'」

我正在研究mpeg layer-III編碼適用於即將推出的項目的方式。我下載了Shine編碼器,因爲它被認爲是最簡單的編碼器。 http://www.mp3-tech.org/programmer/sources/shine.zip是鏈接。

我成功地將它們編譯在一個獨立的項目中,但我需要在QT項目中使用它們。

我在QT 中創建了新的空白控制檯項目,並添加了以前爲我成功編譯的所有文件(來自shine.zip的文件)。

這是我的main.cpp:

#include <QtCore/QCoreApplication> 
#include "main.h" 
int main(int argc, char *argv[]) 
{ 
// QCoreApplication a(argc, argv); 
// return a.exec(); 
    mainc(argc,argv); 
} 

這是main.h:

#ifndef MAIN_H 
#define MAIN_H 
#include "main.c" 
#endif // MAIN_H 

其他一切不變(我的意思是,沒有這兩個文件它成功地編譯和工作)

我現在在這部分出現錯誤

#ifndef bool 
typedef unsigned char bool; <--- "redeclaration of C++ built-in type 'bool'" 
#endif 

在這裏沒有錯誤之前。從我所瞭解的一個cpp文件的存在使得所有的代碼編譯爲C++並且shine代碼是c,而不是C++ ...是否意味着我不能在使用QT類QCoreApplication的項目中使用c代碼?

回答

1

您可以在同一個項目中混合使用C和C++代碼,但需要使用C編譯器編譯C代碼。而不是試圖包括main.c從C++文件,分別編譯的C代碼,並聲明你需要從C++爲extern "C"調用任何C函數,例如

extern "C" int mainc(int argc, char *argv[]); 
+0

謝謝!好的,我明白了,我應該做的是製作一個頭文件,我將其包含在我的main.cpp文件中,此頭文件應該執行此聲明,然後使用與此頭文件相同的名稱進行文件.c應包含實現,對?我的意思是,現在它爲我工作,但我不能確定我做對了... – Istrebitel 2010-10-19 06:37:58

+0

@Istrebite:是的,這聽起來是對的。 – 2010-10-19 10:26:04

0

永遠不要在頭文件中包含實現文件。

#include "main.c" 

是錯誤的。這將導致包含遞歸,如果#ifdef MAIN_H不能保護。

在您的示例中QCoreAppplication包含兩次導致錯誤消息的內容。

+0

謝謝你,現在我已經讀到頭文件我明白我對那個人有錯。所以,如果我得到它的權利,當我包含一個.h文件,編譯器會自動查找相同的名稱.c或.cpp文件的代碼? – Istrebitel 2010-10-19 06:36:48