我有一个cpp文件,如下所示:
@ImplicitReflectionSerializer
i.h文件:
#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;
}
当我编译代码时,发生以下错误:
struct abc;
void fff(struct abc);
如果我将cpp文件另存为c文件并使用c编译器进行编译,则一切正常。 c ++编译器有什么问题?
答案 0 :(得分:8)
通过使用#if targetEnvironment(simulator)
return []
#else
let networkInfo = CTTelephonyNetworkInfo()
return [networkInfo.subscriberCellularProvider]
#endif
,已经将abc
声明为结构体和结构体指针。等同于:
typedef
跳过struct abc {...};
typedef abc abc_t; // ok, abc_t is now an alias for abc
typedef abc *abc; // error
,typedef
和abc_t
并按原样使用该类(默认情况下所有成员均为公共成员)*abc
。
i.h
abc
i.cpp
struct abc {
int a1 = 0;
int b1 = 0;
};
void fun(const abc& x);
main.cpp
#include <iostream>
#include "i.h"
void fun(const abc& x) {
std::cout << x.a1 << "\n";
}
答案 1 :(得分:2)
此
struct abc;
C ++中的声明了类型struct abc
和类型abc
,然后又与typedef
与...*abc
冲突。
在C语言中,它仅声明struct abc
,因此typedef
的{{1}}不会产生重复的声明。
答案 2 :(得分:1)
在C 中,这是
:struct abc
{
int a1;
int b1;
};
创建一个类型struct abc
(大致而言),但是没有创建类型abc
。
这就是为什么您使用typedef
技巧创建我们可以使用的类型而不必到处写struct
的原因:
typedef struct abc{
int a1;
int b1;
} abc_t;
现在您也具有类型abc_t
,它与struct abc
相同。仍然没有类型abc
。
因此,当您添加名为abc
的指针的声明时,这是有效的,因为尚未使用名称。
在C ++ 中,原始声明创建了一个名为abc
的类型。不需要typedef
技巧,并且声明为abc
的指针称为abc
是无效的。
您可以像这样消除您的名字的歧义(并消除代码的混淆):
struct abc
{
int a1;
int b1;
};
typedef struct abc abc_t;
abc_t* ptr_to_abc;
或者,如果您正在编写C ++并且不需要C兼容,则只需:
struct abc
{
int a1;
int b1;
};
abc* ptr_to_abc;