C ++预处理器意外编译错误

时间:2009-02-19 23:55:59

标签: c++ compiler-construction c-preprocessor

请查看以下文件:(这是一个完整的文件)

#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

我收到以下错误;我不知道为什么。我也手动计算了预处理程序指令。

  

AlgorithmLibraryWrapper.hpp:10:1:未终止的#ifdef
      AlgorithmLibraryWrapper.hpp:7:1:未终止的#ifndef

我使用的是糟糕的vxWorks gcc编译器。如果故障是我的或编译器,请告诉我。

6 个答案:

答案 0 :(得分:4)

可能是问题出在所包含的文件中(如果实际上存在未填充的#if / #endif

我会尝试使用其他编译器进行预处理。你可以使用gcc,不管它不会编译。只需获取gcc(如果你在Windows上,则为MinGW)并运行

cpp -Iinclude_direcories your_file

或者,如果您不喜欢gcc,请获取MSVC Express版本。同样,您可以预处理甚至无法编译的代码,因此非工作库等没有问题。

大多数编译器都有一个选项,可以为您提供预处理器的输出,以便您可以检查它正在做什么。例如,

gcc -E file.c >file.preproc

将为您提供预处理的来源,以便您可以检查#if与#endif的平衡。

答案 1 :(得分:3)

猜测,你在#include的一个文件中有一个不匹配的#ifdef / #endif对。您需要查看所有文件(如预处理器所做的那样),而不仅仅是这个文件。

答案 2 :(得分:1)

正如其他人所指出的那样,这很可能是因为包括警卫不匹配。

如果您所包含的文件在您的控制之下(即不属于第三方封闭源库),您可以考虑更换#ifndef等。人。使用#pragma一次保护(用于防止多次包含)。这将消除预处理器指令不匹配的可能性。

有一点需要注意的是pragma once是非标准的,因此只有在编译器支持它时它才会起作用。

答案 3 :(得分:0)

我尝试使用vs 6.0编译你的源代码,但没有得到你提到的错误。正如其他人所说,可能是错误来自包含的头文件。为了让我编译你的代码,我需要评论上面的标题。

请检查上面的标题。

答案 4 :(得分:0)

我通过逐个注释掉部分并试图找出导致错误的部分来调试它。

可能是您的编译器不喜欢嵌套的#ifdefs或者没有正确解释语法。也许它不喜欢#pragmas。

答案 5 :(得分:0)

这是一个很长的镜头,但在你的源文件中你有以下一行:

#   ifdef _MSC_VER

#”字符和指令名称(ifdef)之间有空格。这在C / C ++中有效;然而,它并不常见,所以如果奇怪的编译器在它上面窒息,我不会感到非常惊讶。