2011-08-10 56 views
2

我有一個C++文件,它會一直向鏈中的四個文件拋出錯誤,而使用#include編譯的每個其他文件都會正常編譯。C++文件不會用某個#include編譯,而所有其他編譯器都可以編譯

它一直給我這種東西。我確定包含文件是好的1.所有其他使用這個相同的文件編譯好,我看了看文件,並沒有問題。

/usr/include/opal/opal/mediafmt.h:305:9: error: expected identifier before numeric constant 
/usr/include/opal/opal/mediafmt.h:305:9: error: expected ‘}’ before numeric constant 
/usr/include/opal/opal/mediafmt.h:305:9: error: expected unqualified-id before numeric constant 
/usr/include/opal/opal/mediafmt.h:308:14: error: bit-field ‘mode’ with non-integral type 

很奇怪,因爲它會引發錯誤約5個文件了鏈:

In file included from /usr/include/opal/opal/connection.h:44:0, 
      from /usr/include/opal/opal/call.h:41, 
      from /usr/include/opal/opal/manager.h:42, 
      from /usr/include/opal/opal/endpoint.h:41, 
      from /usr/include/opal/opal/localep.h:41, 
      from /home/jonathan/workspace/HHPVideoServer/opal/GstEndPoint.h:12, 
      from /home/jonathan/workspace/HHPVideoServer/opal/opal-call-manager.h:42, 
      from ../gui/HHPVideoCodecGui.cc:3: 

我檢查,以確保我沒有搞砸任何的#define秒,但,這是唯一的想法我了。有人可以提供我如何跟蹤這個錯誤的好方法嗎?

以下是文件:

http://www.opalvoip.org/docs/opal-v3_9/da/d60/mediafmt_8h-source.html

更新

下面是來自前處理麻煩的線結構。我認爲「0L」是麻煩。

struct H245GenericInfo { 
    H245GenericInfo() { memset(this, 0, sizeof(*this)); } 
    unsigned ordinal:16; 
    enum Modes { 
    0L, 
    Collapsing, 
    NonCollapsing 
    } mode:3; 
    enum IntegerTypes { 
    UnsignedInt, 
    Unsigned32, 
    BooleanArray 
    } integerType:3; 
    bool excludeTCS:1; 
    bool excludeOLC:1; 
    bool excludeReqMode:1; 
}; 

然後

#define None 0L 

從 「/usr/include/X11/X.h」 導致0L在從X11 LIB線305

代替無在模式枚舉。其他文件正在編譯的原因是它們並未使用Gtk。有沒有人有解決方案,不涉及我重寫任何lib文件?

解決方案

我只是把高於一切違規的#include。感謝大家的幫助。

+4

我知道你說過這個檔案很好,但是請你用我們的內容來幽默我們。 –

+2

在其中一個文件中查找缺少的分號。 –

+0

對丟失分號的猜測。或者可能缺少一個右大括號。 – Casper

回答

6

假設您使用的是gcc,請運行gcc -E your-file.c > tmpfile。這隻運行預處理器。產出將會相當龐大,但它應該可以幫助你追蹤問題。

線條305是什麼樣的?

編輯: 鑑於您的更新,是的,問題是「無」被定義爲一個宏之前,您的mediafmt.h試圖將其定義爲一個枚舉。在包含X.h和包含mediafmt.h之前,您可以添加#undef None嗎? (如果是這樣,一定要對它發表評論。)

編輯2:重新排列#include指令可能是一個更好的解決方案 - 但同樣,一定要添加註釋來解釋原因。

+0

請參閱我對該文件的編輯。 –

+0

你能看看我的更新嗎? –

+0

是的,我可以補充一點。使用#undef或重新排列#includes會更好嗎? –

2

因爲你說這包括來自其他文件的作品,我猜你的#includes的順序可能會在失敗的文件中有所不同。嘗試將opal-call-manager.h的#include移動到文件頂部。

理想情況下,您可以按照其他人發佈的答案追查根本原因,但重新排序#include可能是一個快速解決方案,並有助於縮小相沖突的範圍。

+0

謝謝!把它放在文件的頂部,是我需要的最後一招! –

2

既然您找到了0L來代替None那麼很可能您的#define None 0L位於您的包含鏈中。如Klox建議的那樣重新排序包含,因此此定義發生後mediafmt.h已包括在內,或嘗試轉換,取消定義或修復其他地方的有問題的None定義。

相關問題