2

私はC++プロジェクトでオクターブライブラリを使用しています。

#include <octave/oct.h>

ちょうど今、any_iteratorThomasBeckerからの実装でヘッダーを追加しまし

#include "any_iterator.hpp"

ヘッダーを追加したところ、プロジェクトをビルドできませんでした。20を超えるエラーと50を超える警告が表示されました。すべてオクターブヘッダーにあります。例えば:

/usr/include/octave/lo-mappers.h:52: 
error: expected unqualified-id before ‘(’ token

コードで:

#if defined (HAVE_CMATH_ISNAN)
inline bool xisnan (double x)
{ return std::isnan (x); }         // line 52
#else

また

/usr/include/octave/ov-base.h:580: 
error: expected ‘)’ before ‘void’

宣言で:

virtual octave_value isnan (void) const;

ヘッダーを削除するとすぐに、問題は解決しました。また、別のプロジェクトでは、any_iterator期待どおりに動作します。共存できないように見えます。

何か案は?私は完全に迷子になっています。名前any_iterator空間によっても保護されています。

4

2 に答える 2

6

もちろんできます!なぜだめですか?それは本当に何でもかまいません。たとえば、ヘッダーで名前空間を開き、それを閉じるのを忘れてから、このヘッダーをプロジェクトに含めれば完了です。コンパイラはカッコウになり、実際にはエラーとは関係のないさまざまな場所を指し示すエラーをスローし始めます。

于 2012-04-12T18:02:44.810 に答える
3

はい。しかし、方法ははるかに難しい質問です。

これをデバッグするのに役立つオプションが少なくとも 2 つあります。

  1. ファイルをコンパイルするコマンドライン オプションに -E を追加します。これにより、プリプロセッサが実行され、すべてのヘッダーが添付され、すべてのマクロが展開されたコードが吐き出されます。次に、その前処理を試してコンパイルし、窒息している理由を正確に確認できます。

  2. gcc ではなく、clang でコンパイルしてみてください。Clang は、わかりやすいエラー メッセージを表示するのに優れています。

「any_iterator.hpp」を置くことで問題が修正されたという事実は、any_iterator に問題のあるコードが含まれていることを意味します。おそらく間接的に cmath が含まれており、何らかの形で問題を引き起こしています。cmath を octave/oct.h の上に含めると、同じように壊れてしまうに違いありません。

于 2012-04-12T18:15:23.030 に答える