3 votes

Erreurs de compilation inattendues du préprocesseur C++

Veuillez consulter le fichier suivant : (il s'agit d'un fichier complet)

#ifndef TEES_ALGORITHM_LIBRARY_WRAPPER_H
#define TEES_ALGORITHM_LIBRARY_WRAPPER_H

#ifdef _TEES_COMPILE_AS_LIB
#include <dfa\Includes\DFC_algorithms.hpp>
#include <DFA\FuzzyClassifier\FuzzyAlgorithmIntialization\InitFuzzyAlgorithm.hpp>
typedef teesalgorithm::tees_fuzzy_algorithms algorithms_switchyard_class;
#else
#include <DFA\Includes\commercial_algorithms.hpp>
//An incomplete class to hide implementation
class algorithms_switchyard_class;
#endif

class AlgorithmLibraryWrapper {
algorithms_switchyard_class * algorithmPtr_;

typedef teesalgorithm::tees_paramObj paramObj_type;
typedef teesalgorithm::tees_errorObj errorObj_type;  
typedef teesalgorithm::tees_statusObj statusObj_type;
typedef teesalgorithm::tees_dataObj dataObj_type;
typedef teesalgorithm::tees_outputObj outputObj_type;

public:

AlgorithmLibraryWrapper(const std::string& sAlgName, paramObj_type& paramObj,     errorObj_type& errObj, statusObj_type& statusObj, const char* sFilePath);
static bool dataReader(const std::string& sFileName, dataObj_type& dataObj,     errorObj_type& errObj, statusObj_type& statusObj);
bool runalgorithm(const dataObj_type& dataObj, outputObj_type& outObj, errorObj_type& errObj, statusObj_type& statusObj); 
~AlgorithmLibraryWrapper();

};

#ifdef _TEES_USE_COMPILED_ALGORITHM_LIB
#   ifdef _MSC_VER
    #if _MSC_VER < 1400  // If VC 2003
        #ifdef _DEBUG
            #error No AlgorithmLibWrapper libraries compiled for this version of VC
        #else
            #error No AlgorithmLibWrapper libraries compiled for this version of VC
        #endif
    #elif defined(UNDER_CE)  // Win CE
        #ifdef _DEBUG
            #pragma comment( lib, "AlgorithmLibWrapperCEd" )
        #else
            #pragma comment( lib, "AlgorithmLibWrapperCE" )
        #endif
    #else  // If VC 2005
        #ifdef _DEBUG
            #pragma comment( lib, "AlgorithmLibWrapperd" )
        #else
            #pragma comment( lib, "AlgorithmLibWrapper" )
        #endif
    #endif
#endif 
#endif

#endif //TEES_ALGORITHM_LIBRARY_WRAPPER_H

J'obtiens les erreurs suivantes ; je ne sais pas pourquoi. J'ai également compté manuellement les directives du préprocesseur.

AlgorithmLibraryWrapper.hpp:10:1 : unterminated #ifdef
AlgorithmLibraryWrapper.hpp:7:1 : unterminated #ifndef

J'utilise le mauvais compilateur gcc de vxWorks. Merci de me faire savoir si la faute est la mienne ou celle du compilateur.

4voto

jpalecek Points 31928

Il se peut que le problème se situe au niveau des fichiers inclus (s'il y a effectivement des fichiers non équilibrés). #if / #endif s.

J'essaierais d'effectuer un prétraitement avec un autre compilateur. Vous pouvez utiliser gcc pour cela, peu importe qu'il ne compile pas. Téléchargez simplement gcc (ou MinGW si vous êtes sous Windows) et exécutez

cpp -Iinclude_direcories your_file

Ou, si vous n'aimez pas gcc, prenez MSVC Express edition. Là encore, vous pouvez prétraiter le code qui ne se compile même pas, donc pas de problème avec les bibliothèques qui ne fonctionnent pas, etc.

La plupart des compilateurs ont une option qui vous donne la sortie du préprocesseur afin que vous puissiez vérifier ce qu'il fait. En voici un exemple,

gcc -E file.c >file.preproc

vous donnera le source pré-traité afin que vous puissiez vérifier l'équilibre entre #if et #endif.

3voto

A mon avis, l'un des fichiers que vous #incluez à partir de celui-ci a une paire #ifdef/#endif mal assortie. Vous devez examiner tous les fichiers (comme le fait le préprocesseur), et pas seulement celui-ci.

1voto

Comme d'autres l'ont fait remarquer, cela est probablement dû au fait que les gardes de l'inclusion ne sont pas assortis.

Si les fichiers que vous incluez sont sous votre contrôle (c'est-à-dire qu'ils ne font pas partie d'une bibliothèque tierce à code source fermé), vous pouvez envisager de remplacer les gardes #ifndef et autres (qui sont utilisées pour empêcher l'inclusion multiple) par #pragma once. Cela éliminera la possibilité d'avoir des directives de préprocesseur non concordantes.

Une mise en garde s'impose toutefois pragma once n'est pas standard, il ne fonctionnera donc que si votre compilateur le prend en charge.

0voto

user67003 Points 37

J'ai essayé de compiler votre source en utilisant vs 6.0 mais je n'ai pas obtenu l'erreur que vous avez mentionnée. Comme d'autres l'ont dit, il se peut que l'erreur provienne du fichier d'en-tête inclus. Pour que votre code soit compilé, je dois commenter l'en-tête ci-dessus.

Veuillez vérifier une fois l'en-tête ci-dessus.

0voto

Adam Pierce Points 12801

Je déboguerais ce problème en commentant les sections une par une et en essayant d'identifier la section qui provoque l'erreur.

Il se peut que votre compilateur n'aime pas les #ifdefs imbriqués ou qu'il n'interprète pas la syntaxe correctement. Il n'aime peut-être pas les #pragmas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X