2012-04-12 60 views
2

我在C++項目中使用了八度音程庫。可以包括一個庫在C++中打破另一個庫的功能嗎?

#include <octave/oct.h> 

剛纔我加了一個頭與any_iterator implemetation從Thomas Becker

#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甚至受命名空間保護。

+0

這兩個標題按什麼順序排列? – Catskul 2012-04-12 18:09:35

+0

#include「any_iterator.hpp」首先是 – 2012-04-12 18:12:10

+1

你有沒有嘗試在其他順序中包含它們?你也可以通過any_iterator.hpp中的特定代碼鏈接到一個粘貼bin? – Catskul 2012-04-12 18:13:59

回答

6

當然可以!爲什麼不?這可能是任何事情,真的。舉例來說 - 在標題中打開一個名稱空間並忘記關閉它,然後將此標題包含在您的項目中,然後完成。編譯器會杜鵑,並開始向您指出錯誤的地方,而這些地方實際上與錯誤無關。

+0

我試圖把所有東西放在八度/ oct.h中的一個名稱空間中,但似乎我沒有更改頭文件的權限(只讀)。請問有沒有解決方法? – 2012-04-12 18:08:25

+0

@MartinDrozdik:最簡單的解決方法是不使用any_iterator。你需要那個壞嗎?如果是這樣,你必須排除故障並找出造成問題的原因。可能是octave和該迭代器頭部之間的一些衝突,或者可能只是一個錯誤的代碼......上帝知道它是什麼。一旦你弄清楚了 - 你可以問這裏如何解決它。 – 2012-04-12 18:13:05

+0

謝謝,我現在試着沒有它:D – 2012-04-12 18:14:24

3

是的。但是,這是一個更難的問題。

至少有兩個選項可以幫助我調試這個問題。

  1. 將編輯該文件的命令行選項添加-E。這將導致預處理器運行並吐出代碼,並附上所有標題並展開所有宏。然後,您可以嘗試編譯預先編譯好的代碼,並可以準確瞭解它爲什麼會窒息。

  2. 嘗試使用clang而不是gcc編譯。 Clang在提供可理解的錯誤消息方面要好得多。

把「any_iterator.hpp」固定的問題意味着any_iterator包含有問題的代碼。它可能間接包含cmath並以某種方式引起問題。我敢打賭,如果你把cmath包含在octave/oct.h以上,它會以同樣的方式破解。

+0

謝謝!我會嘗試兩個 – 2012-04-12 18:23:55

相關問題