C++ 用于编译Cpp文件(包括C第三方头文件)的任何gcc标记

C++ 用于编译Cpp文件(包括C第三方头文件)的任何gcc标记,c++,gcc,struct,g++,header-files,C++,Gcc,Struct,G++,Header Files,下面有第三部分头文件(header.h)定义了一个结构a,当将其作为C语言处理时,可以通过编译。但我们试图将该文件包含在CPP文件中,但由于g++编译更多限制或其他原因,编译失败 shell@hercules$ 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: ‘st

下面有第三部分头文件(header.h)定义了一个结构a,当将其作为C语言处理时,可以通过编译。但我们试图将该文件包含在CPP文件中,但由于g++编译更多限制或其他原因,编译失败

shell@hercules$ 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;
}
#包括“header.h”
#包括
使用名称空间std;
int main()
{
连接列表;
list.data=1;
list.next=NULL;
库特
我不知道在某些编译器中,你在这里所做的是否有效,但我觉得这似乎是错误的。如果你使用typedef,你不应该在typename前面加上
struct
。在这种情况下,一旦声明了struct,就会定义名称
conn\u t
,但在声明中无效。这样,代码就不会我的工作:

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

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

应该这样写,以便有一个typedef和对结构本身的引用:

typedef struct tag_conn_t
{
   int data;
   struct tag_conn_t *next;
}conn_t;
祝你好运

尤连

  • 首先,头文件是第三方C头文件,可以用C语言编译
  • 第二,头文件不能更新,只是为了特定目的,我必须在我的C++文件中包含这个头文件,然后在编译C++时,头文件也会被当作C++来处理,这就是我遇到的问题。
    <>我仍然需要你的天才给我答案,非常感谢你的回答。< < P> >我相信<>代码> -x语言<代码>标签,在Gcc/g++中使用<代码> C标题>代码>你在寻找什么。< /P>这里有C++和C++的区别。ode>在不使用
    struct
    的情况下使用连接名。它仍然有效。谢谢您的回答,但不会更新头文件,因为头文件是第三方的。是的,定义是有效的C,但在C中,“next”字段不指向“conn\u t”类型的值,而是指向“struct conn\u t”类型的值在C中,“CnnIt”和“StuttCnnt”可以是不同的类型。在C++中,它们不能。这就是为什么这是C++中的错误。但是,这里,我们必须处理“CONNETT”和“SCORT CONNETT”。如果是这种情况,你应该做一个C++调用的C包装器。在C包装器中,你可以包含文件并创建函数,这样你就可以导出功能。但是,你仍然可以修改标题,只要你在标题中提到这个地方。因为结构不会改变大小/偏移,它应该工作。这是一个简单的头文件,如本例所示可以,但事实是头文件不包含唯一的类型定义。因此,头文件修改似乎不是一个好主意,我认为::pIf只有这种类型的问题,请确保您可以制作一个脚本(perl?)来自动执行此操作。您可以搜索“typedef struct{…STUFF…”NAME;“将其更改为”typedef struct tag#NAME#“…并在内容中将“struct#NAME#”替换为“struct tag#NAME#”这是我要做的——自动的。如果头是一个有效的C头,但是一个无效的C++头,你会怎么做?向供应商抱怨?我认为唯一的选择是把头文件包含在C文件中,写一个C接口,它做我们需要的任何东西,并从C++代码调用那个接口。是的,我在寻找这样的标签,但是我使用的时候。“-X C”标签,Me.CPP无法通过编译,因为Me.CPP的某些部分应被视为C++。
    typedef struct tag_conn_t
    {
       int data;
       struct tag_conn_t *next;
    }conn_t;