2009-02-19 2 views
2

Пожалуйста, посмотрите на следующий файл: (это полный файл)C++ препроцессор неожиданных ошибок компиляции

#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 компилятор. Пожалуйста, дайте мне знать, является ли ошибка моей или компилятором.

ответ

4

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

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

cpp -Iinclude_direcories your_file 

или, если вам не нравится GCC, получить MSVC Express Edition. Опять же, вы можете код препроцессирования, что даже не компилируется, поэтому проблем с библиотекой неработы и т. д.

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

gcc -E file.c >file.preproc 

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

+0

Я не считаю излишним endif. Они, похоже, подходят мне. Отступ большого блока мне не по душе, но все же соответствует. Если вы имеете в виду конечный endif, это включенный охранник, который был запущен вверху. – paxdiablo

+0

Нет, я не имел в виду финал, но преоиус. Тем не менее, вы правы, это правильно. – jpalecek

+0

@jpalecek, «gcc -E» сгенерирует вывод препроцессора в stdout, который вы можете проверить на баланс. Я добавил, что, надеюсь, вы не против. – paxdiablo

3

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

+0

Действительно, это так. Запуск 'cpp' на этом создает чистый файл (без включений, конечно). – greyfade

+0

Извините, zabzonk, я должен был забрать мой апвест с тех пор, как вы удалили полезные дополнения. Я подумал, что важно упомянуть, как это сделать, а не только, что это можно сделать. Но это ваш ответ, а не мой. – paxdiablo

1

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

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

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

0

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

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

0

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

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

0

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

# ifdef _MSC_VER 

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

Смежные вопросы