C++ c+中的冲突声明+;

C++ c+中的冲突声明+;,c++,struct,typedef,C++,Struct,Typedef,我有一个cpp文件,如下所示: #include <iostream> #include "i.h" using namespace std; typedef struct abc{ int a1; int b1; } abc_t, *abc; void fun(abc x){ cout<<x->a1; } int main(){ abc val; fun(val); return 0; } 编译代码时出现以下错误: t.cpp:8: error:

我有一个cpp文件,如下所示:

#include <iostream> 

#include "i.h"

using namespace std; 

typedef struct abc{
int a1;
int b1;
} abc_t, *abc;

void fun(abc x){
cout<<x->a1;
}

int main(){
abc val;
fun(val);
return 0;
}
编译代码时出现以下错误:

t.cpp:8: error: conflicting declaration ‘typedef struct abc* abc’

t.cpp:5: error: ‘struct abc’ has a previous declaration as ‘struct abc’

t.cpp: In function ‘void fun(abc)’:

t.cpp:11: error: base operand of ‘->’ has non-pointer type ‘abc’
如果我将cpp文件保存为c文件并使用c编译器进行编译,那么一切都可以正常工作。 C++编译器有什么问题?

< P>这个

struct abc;
<>在C++中声明类型<代码>结构ABC < /C>以及类型<代码> ABC <代码>,然后与<代码> TyPulf< <代码>“IN代码>……*ABC 再次。

在C语言中,它只是声明
struct abc
,因此
typedef
'ing
..*abc
不会产生重复的声明。

struct abc;
<>在C++中声明类型<代码>结构ABC < /C>以及类型<代码> ABC <代码>,然后与<代码> TyPulf< <代码>“IN代码>……*ABC 再次。


在C语言中,它只声明
struct abc
,因此
typedef
'ing
..*abc
不会产生重复的声明。

您使用
typedef
abc
声明为结构和指向结构的指针。这与执行以下操作相同:

struct abc {...};
typedef abc abc_t; // ok, abc_t is now an alias for abc
typedef abc *abc;  // error
跳过
typedef
abc\u t
*abc
并按原样使用该类(默认情况下所有成员都是公共的)
abc

i.h

struct abc {
    int a1 = 0;
    int b1 = 0;
};

void fun(const abc& x);
i.cpp

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

void fun(const abc& x) {
    std::cout << x.a1 << "\n";
}
#include <iostream>    
#include "i.h"

int main(){
    abc val;
    fun(val);
    return 0;
}
#包括
#包括“i.h”
虚无乐趣(康斯特abc&x){

std::cout您已使用
typedef
abc
声明为结构和指向结构的指针。这与执行以下操作相同:

struct abc {...};
typedef abc abc_t; // ok, abc_t is now an alias for abc
typedef abc *abc;  // error
跳过
typedef
abc\u t
*abc
并按原样使用该类(默认情况下所有成员都是公共的)
abc

i.h

struct abc {
    int a1 = 0;
    int b1 = 0;
};

void fun(const abc& x);
i.cpp

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

void fun(const abc& x) {
    std::cout << x.a1 << "\n";
}
#include <iostream>    
#include "i.h"

int main(){
    abc val;
    fun(val);
    return 0;
}
#包括
#包括“i.h”
虚无乐趣(康斯特abc&x){

std::cout在C中,这是:

struct abc
{
   int a1;
   int b1;
};
创建类型
struct abc
(粗略地说),但不创建类型
abc

这就是为什么您可以使用
typedef
技巧创建一个类型,而无需在任何地方编写
struct

typedef struct abc{
   int a1;
   int b1;
} abc_t;
现在您也有了类型
abc\u t
,它与
struct abc
相同。仍然没有类型
abc

因此,当您添加名为
abc
的指针声明时,这是有效的,因为尚未使用名称


在C++中,原始声明创建了一个名为
abc
的类型。不需要使用
typedef
技巧,并且名为
abc
的指针声明无效,因为名称为
abc


解决方案 您可以这样消除姓名的歧义(并消除代码的混淆):

或者,如果你正在写C++,不需要C COMPAT,就这样:

struct abc
{
   int a1;
   int b1;
};

abc* ptr_to_abc;

在C中,这是:

struct abc
{
   int a1;
   int b1;
};
创建类型
struct abc
(粗略地说),但不创建类型
abc

这就是为什么您可以使用
typedef
技巧创建一个类型,而无需在任何地方编写
struct

typedef struct abc{
   int a1;
   int b1;
} abc_t;
现在您也有了类型
abc\u t
,它与
struct abc
相同。仍然没有类型
abc

因此,当您添加名为
abc
的指针声明时,这是有效的,因为尚未使用名称


在C++中,原始声明创建了一个名为
abc
的类型。不需要使用
typedef
技巧,并且名为
abc
的指针声明无效,因为名称为
abc


解决方案 您可以这样消除姓名的歧义(并消除代码的混淆):

或者,如果你正在写C++,不需要C COMPAT,就这样:

struct abc
{
   int a1;
   int b1;
};

abc* ptr_to_abc;


我已经编辑了问题,为什么你在CPP文件中声明<代码>结构>代码?而不是头文件?这不是C,它是C++。在C++中,你不能有TyBuff.StultABC {}。我编辑了问题,为什么你在CPP文件中声明了<代码>结构>代码?不是C,而是C++。在C++中,你不能有<代码> TyBuffFraseABC {} abc;< /C> >我没有得到它。typedefNAME,otherTypedefNAME;
结构和typedef不能同时具有相同的名称。@KarthikKM•不能具有相同的标识符意味着两种不同的东西。我没有得到它
typedef struct StructNAME{…}Type DeFixNead,Type Type DeNeNeX;您不能同时为Stult和TyPulf拥有相同的名称。@ KalTikkM.您不能拥有相同的标识符意味着两种不同的东西。@ TEDLYNGMO,因为OP问为什么它在C中工作,而不是C++。如果没有比较这两个,您就不能回答这个问题。AHHH……直到现在我才注意到。刚才看到了。因为你在OC上问为什么它不能在C上而不是C++。如果你不比较这两个字,你就不能回答这个问题。AHHH……直到现在我才注意到。刚才看到了RC++ C++标签,可能过滤掉C部分。好的catch。