Непредвиденные ошибки компиляции препроцессора C ++ - PullRequest
2 голосов
/ 20 февраля 2009

Пожалуйста, посмотрите на следующий файл: (это полный файл)

#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

Я использую плохой компилятор gx vxWorks. Пожалуйста, дайте мне знать, если ошибка моя или компилятор.

Ответы [ 6 ]

4 голосов
/ 20 февраля 2009

Возможно, проблема во включенных файлах (если на самом деле есть несбалансированные #if / #endif s.

Я бы попробовал предварительную обработку с другим компилятором. Вы можете использовать для этого gcc, не важно, что он не скомпилируется. Просто получите gcc (или MinGW, если у вас Windows) и запустите

cpp -Iinclude_direcories your_file

Или, если вам не нравится gcc, получите MSVC Express edition. Опять же, вы можете предварительно обработать код, который даже не компилируется, так что никаких проблем с неработающей библиотекой и т. Д.

У большинства компиляторов есть опция, которая выдаст вам вывод препроцессора, чтобы вы могли проверить, что он делает. Например,

gcc -E file.c >file.preproc

даст вам предварительно обработанный источник, чтобы вы могли проверить балансировку #if против # endif.

3 голосов
/ 20 февраля 2009

Предположительно, один из файлов, из которых вы #include из этого, имеет несоответствующую пару # ifdef / # endif. Вам нужно просмотреть все файлы (как это делает препроцессор), а не только этот.

1 голос
/ 20 февраля 2009

Как уже отмечали другие, это, скорее всего, связано с несовпадающими включенными охранниками.

Если файлы, которые вы включаете, находятся под вашим контролем (то есть не являются частью сторонней библиотеки с закрытым исходным кодом), вы можете подумать о замене #ifndef et. и др. Охранники (которые используются для предотвращения многократного включения) с #pragma один раз. Это исключит возможность несоответствия директив препроцессора.

Единственное предостережение в том, что прагма один раз является нестандартной, поэтому она будет работать только в том случае, если ваш компилятор ее поддерживает.

0 голосов
/ 20 февраля 2009

Это длинный выстрел, но в вашем исходном файле есть следующая строка:

#   ifdef _MSC_VER

где есть пробел между символом '#' и именем директивы (ifdef). Это действительно в C / C ++; однако, это не так часто встречается, поэтому я не был бы очень удивлен, если бы странный компилятор подавился им.

0 голосов
/ 20 февраля 2009

Я бы отладил это, комментируя разделы один за другим и пытаясь определить, какой раздел вызывает ошибку.

Возможно, ваш компилятор не любит вложенные #ifdefs или неправильно интерпретирует синтаксис. Может быть, ему не нравятся # прагмы.

0 голосов
/ 20 февраля 2009

Я попытался скомпилировать ваш исходный код, используя версию 6.0, но не получил ошибку, которую вы упомянули. Как говорят другие, возможно, ошибка исходит из включенного заголовочного файла. Чтобы получить ваш код, мне нужно прокомментировать вышеуказанный заголовок.

Пожалуйста, проверьте вышеуказанный заголовок один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...