2011-04-01 65 views
1

有第三部分头文件(header.h)定义了下面的结构体a,当它作为C语言处理时可以通过编译。但是我们试图将这个文件包含在CPP文件中,并且编译失败,因为g ++编译更多限制或其他原因?gcc的任何标签可以编译包含C第三方头文件的Cpp文件

[email protected]$ g++ main.cpp 
In file included from main.cpp:1: 
header.h:10: error: conflicting declaration ‘typedef struct conn_t conn_t’ 
header.h:9: error: ‘struct conn_t’ has a previous declaration as ‘struct conn_t’ 
main.cpp: In function ‘int main()’: 
main.cpp:8: error: aggregate ‘conn_t list’ has incomplete type and cannot be defined 

头文件header.h:

1 #ifndef __HEADER_H__ 
2 #define __HEADER_H__ 
3 #ifdef __cplusplus 
4 extern "C" { 
5 #endif 
6 typedef struct 
7 { 
8  int data; 
9  struct conn_t *next; 
10 }conn_t; 
11 
12 #ifdef __cplusplus 
13 } 
14 #endif 
15 
16 #endif // __HEADER_H__ 

cpp文件main.cpp中

#include "header.h" 
#include <iostream> 

using namespace std; 
int main() 
{ 
    conn_t list; 
    list.data = 1; 
    list.next = NULL; 
    cout<<"hello:"<<list.data<<endl; 
    return 0; 
} 

问:是否有编译它的GCC/G ++任何标记?

回答

1
typedef struct 
{ 
    int data; 
    struct conn_t *next; 
}conn_t; 

我不知道,如果在一些编译器你在这里做是有效的,但似乎我错了。如果您使用typedef,则不应在struct前加上类型名称。在这种情况下名称conn_t将在结构声明后立即定义,但在内部无效。这样代码将工作:

struct conn_t 
{ 
    int data; 
    struct conn_t *next; 
}; 

没有typedefs,我只是使用结构名称。

+0

这里有C和C++之间的另一个区别。在C++中,不需要'typedef struct conn_t conn_t;'来使用不带'struct'的conn_t名称。它无论如何工作。 – 2011-04-01 06:53:08

+0

感谢您的回答,但由于头文件是第三方,所以不会更新头文件。 – 2011-04-01 09:02:40

+0

是的,定义是有效的C,但在C中,字段“next”不指向类型为“conn_t”的值,它指向类型“struct conn_t”的值,这是一个完全不同的类型。在C中,“conn_t”和“struct conn_t”可以是不同的类型。在C++中,他们不能。这就是为什么这是C++中的错误。但是在这里,我们必须将“conn_t”和“struct conn_t”视为同一类型。 – 2011-04-03 03:31:59

1

应该为了这样写有一个typedef,并具有对结构本身的引用:

typedef struct tag_conn_t 
{ 
    int data; 
    struct tag_conn_t *next; 
}conn_t; 

祝你好运,

尤利安

+0

前提条件是不允许更新头文件。 – 2011-04-01 09:03:54

+0

如果是这种情况,应该从C++调用C封装器。在C包装器中包含文件并创建函数,以便您可以导出该功能。 – INS 2011-04-01 10:45:37

+0

但是你仍然可以按照描述修改头文件,只要你在头文件的某处提到它。由于结构不会改变大小/偏移,所以它应该可以工作。 – INS 2011-04-01 10:47:25

0
  1. 首先,头文件是第三方C头文件,可以用C语言编译;其次,头文件不能更新,只是为了特定目的,我必须将这个头文件包含在我的C++文件中,然后在编译C++期间,头文件也将被视为C++,这就是问题所在我遇到过。

我还是需要你的天才给我答案,真的很感谢你们在这里的回应。

+0

如果头是一个有效的C头,但是一个无效的C++头,你会怎么做?向供应商抱怨? – 2011-04-01 18:11:04

+0

我认为唯一的选择是#在C文件中包含头文件,编写一个C接口,它执行我们需要的任何操作,并从C++代码中调用该接口。 – 2011-04-03 03:33:19

0

我相信-x language标记,c-header用于gcc/g ++上的语言是你正在寻找的。

+0

是的,我正在寻找这样的标签,但由于我使用“-x c”标签,main.cpp无法通过编译,因为main.cpp的某些部分应该被视为C++。 – 2011-04-03 03:35:01