2010-05-16 83 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”问题。