2010-10-18 39 views
0

Salutations. J'étudie la façon dont l'encodage mpeg layer-III fonctionne pour un projet à venir. J'ai téléchargé l'encodeur de brillance car il est dit être le plus simple de tous. http://www.mp3-tech.org/programmer/sources/shine.zip est le lien.Essayer d'étudier brillance encodeur MPEG Layer-III - obtenir "redéclaration de type intégré C++ 'bool'"

J'ai réussi à les compiler dans un projet autonome, mais je dois les utiliser dans un projet QT.

J'ai fait un nouveau projet de console vide dans QT et ajouté comme existant tous les fichiers qui ont déjà été compilés avec succès pour moi (fichiers de shine.zip).

Ceci est mon main.cpp:

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

Ceci est main.h:

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

tout le reste est intact (je veux dire, sans ces deux fichiers, il compilé avec succès et a travaillé)

Je reçois maintenant une erreur à cette partie

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

Avant il n'y avait pas d'erreur ici. D'après ce que je comprends une présence d'un fichier cpp fait tout le code compiler en C++ et le code de brillance est c, pas C++ ... Cela signifie que je ne peux pas utiliser le code c dans un projet qui utilise QT classes QCoreApplication?

Répondre

1

Vous pouvez mélanger du code C et C++ dans le même projet, mais vous devez compiler le code C avec un compilateur C. Plutôt que d'essayer d'inclure main.c à partir d'un fichier C++, compiler le code C séparément, et déclarer toutes les fonctions C vous devez appeler à partir de C++ comme extern "C", par exemple

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

Merci! Ok je vois, donc, ce que je devrais avoir fait, est de faire un fichier d'en-tête que j'inclue dans mon fichier main.cpp, ce fichier d'en-tête devrait faire cette déclaration et ensuite le fichier avec le même nom que cette entête .c devrait contenir l'implémentation, droite? Je veux dire, maintenant c'est de travailler pour moi, mais je ne peux pas être sûr que je l'ai bien fait ... – Istrebitel

+0

@Istrebite: oui, ça sonne bien. –

0

N'incluez jamais le fichier d'implémentation dans le fichier d'en-tête. Le

#include "main.c" 

est faux. Cela conduirait à une récursion incluse, si le #ifdef MAIN_H ne protégeait pas.

Dans votre exemple, QCoreAppplication est inclus deux fois ce qui conduit au message d'erreur.

+0

Merci, je l'ai lu sur les fichiers d'en-tête maintenant et je comprends que j'avais tort avec celui-là. Donc, si je comprends bien, quand j'inclus un fichier .h, le compilateur cherchera automatiquement dans le même nom .c ou .cpp pour le code? – Istrebitel