3

次のファイルを見てください: (これは完全なファイルです)

#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

6 に答える 6

4

含まれているファイルに問題がある可能性があります (実際にバランスの取れていない#if/ #endifs.

別のコンパイラで前処理を試みます。そのためにgccを使用できますが、コンパイルされなくてもかまいません。gcc (Windows の場合は MinGW) を入手して実行するだけです。

cpp -Iinclude_direcories your_file

または、gcc が気に入らない場合は、MSVC Express エディションを入手してください。繰り返しになりますが、コンパイルされないコードでも前処理できるため、動作しないライブラリなどの問題はありません。

ほとんどのコンパイラには、プリプロセッサからの出力を提供するオプションがあり、それが何をしているかを確認できます。例えば、

gcc -E file.c >file.preproc

前処理されたソースが提供されるので、#if と #endif のバランスを確認できます。

于 2009-02-20T00:07:53.703 に答える
3

推測では、このファイルから #include しているファイルの 1 つに、一致しない #ifdef/#endif ペアがあります。このファイルだけでなく、すべてのファイルを調べる必要があります (プリプロセッサが行うように)。

于 2009-02-20T00:08:49.690 に答える
1

他の人が指摘しているように、これはインクルードガードの不一致が原因である可能性が最も高いです。

含めるファイルが管理下にある場合 (つまり、サード パーティのクローズド ソース ライブラリの一部ではない場合)、#ifndef et を置き換えることを検討できます。アル。#pragma once によるガード (複数の包含を防ぐために使用されます)。これにより、プリプロセッサ ディレクティブが一致しない可能性がなくなります。

これに関する 1 つの注意点は、pragma onceが非標準であるため、コンパイラがサポートしている場合にのみ機能することです。

于 2009-02-20T00:48:21.983 に答える
0

vs 6.0を使用してソースをコンパイルしようとしましたが、前述のエラーは発生しませんでした。他の人が言ったように、エラーはインクルードされたヘッダーファイルから来ている可能性があります。コードをコンパイルするには、上記のヘッダーにコメントする必要があります。

上記のヘッダーを一度確認してください。

于 2009-02-20T03:40:54.097 に答える
0

セクションを1つずつコメントアウトし、エラーの原因となっているセクションを特定することで、これをデバッグします。

コンパイラがネストされた#ifdefsを好まないか、構文を正しく解釈していない可能性があります。たぶんそれは#pragmasが好きではありません。

于 2009-02-20T03:54:56.497 に答える
0

これはロング ショットですが、ソース ファイルには次の行があります。

#   ifdef _MSC_VER

#' ' 文字とディレクティブ名 ( )の間には空白がありますifdef。これは C/C++ で有効です。ただし、あまり一般的には見られないので、奇妙なコンパイラがそれを詰まらせてもあまり驚かないでしょう。

于 2009-02-20T05:08:52.527 に答える