我有一个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;
}
ih 文件:
struct abc;
void fff(struct abc);
当我编译代码时发生以下错误:
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++编译器有什么问题?
原文由 Karthik K M 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 C 中,这是:
创建一个类型
struct abc
(粗略地说),但不是一个类型abc
。这就是为什么您使用
typedef
技巧来创建我们可以使用的类型,而无需在任何地方编写struct
:现在您也有了
abc_t
类型,它与struct abc
相同。仍然没有类型abc
。因此,当您添加一个名为
abc
的指针的声明时,这是有效的,因为尚未使用该名称。在 C++ 中,原始声明创建了一个名为
abc
的类型。不需要typedef
技巧,并且您声明的指针abc
是无效的,因为名称abc
被占用。解决方案
您可以像这样消除您的姓名的歧义(并对代码进行去混淆处理):
或者,如果您正在编写 C++ 并且不需要 C 兼容,则只需: