C ++中的声明冲突

时间:2019-01-25 11:32:21

标签: c++ struct typedef

我有一个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 ++编译器有什么问题?

3 个答案:

答案 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 typedefabc_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;