2010-05-16 92 views
0

我有一個頭文件BKE_mesh.h以下組塊:使用C頭文件將不使用C編譯,但將與C++

/* Connectivity data */ 
typedef struct IndexNode { 
    struct IndexNode *next, *prev; 
    int index; 
} IndexNode; 
void create_vert_face_map(ListBase **map, IndexNode **mem, const struct MFace *mface, 
      const int totvert, const int totface); 
void create_vert_edge_map(ListBase **map, IndexNode **mem, const struct MEdge *medge, 
      const int totvert, const int totedge); 

注意,頭文件是爲的可能性製備在一個C++文件,因爲它有:

#ifdef __cplusplus 
extern "C" { 
#endif 

在文件的頂部,和需要完成在底部。但是實現它的類是用C語言編寫的。接下來,每當我嘗試#include頭文件時,出現一個奇怪的錯誤。如果文件擴展名爲.cpp,那麼編譯就好,沒有任何抱怨。但是,如果我這樣做:

具有.C擴展名的文件裏面,我得到以下錯誤:

expected ')' before '*' token 

的最後兩個功能,在特定的變量:

ListBase **map 

這兩個類。 (注意早些時候在頭文件中聲明瞭它,但沒有定義ListBase)。

所以,我的問題是:爲什麼這個有效的C++代碼,而不是C代碼?

謝謝。

回答

6

在C++中,您可以直接引用結構名稱,但在C中,您需要預先添加關鍵字struct

void create_vert_face_map(struct ListBase **map, ...); 

你可以通過添加一個typedef來解決這個問題。那麼你不必修改函數聲明。

typedef struct ListBase ListBase; 
+0

/我sla了his頭。謝謝。我認爲就是這樣。 (ListBase是這樣定義的:struct ListBase;)。它讓我想知道它是如何作爲一個C文件工作的......哦,還有,不應該用extern「C」{...}來包裝它,導致它出現相同的錯誤?謝謝。 – 2010-05-16 21:53:19

+0

一些C編譯器在當天用來自動檢測這個錯誤。有些人曾經編譯過「C」庫,就好像它們是C++的C鏈接一樣。 – Joshua 2010-05-16 22:04:02

+1

@Leif Anderson:在extern中包裝文件「C」{}除了改變鏈接器的工作方式外什麼也不做。你似乎認爲C/C++是相似的。幸運的是C++是一種完全不同的語言,應該這樣對待。 Java與C具有相同的基本語義,但您不認爲這兩種語言是可以互換的! – 2010-05-16 22:14:49

0

嘗試爲每種情況運行預處理器。 比較結果可能會顯示不同的頭文件。 如果是這樣,它可能暗示「C」問題。