【问题标题】:Typecasting user-define datatype in C [duplicate]在C中类型转换用户定义的数据类型[重复]
【发布时间】:2017-02-19 09:01:27
【问题描述】:
//data type 1
typedef struct t_A{
    int mJ;
}A;

//data type 2        
typedef struct t_B{
    int mK;
}B;

//Function returning B object which is a rValue
B funcRetB(void)
{
    B test;
    test.mK = 9;
    return test;
}

void main(void)
{
    A a;
    a = (A)funcRetB(); //How to typecast this without defining a variable of B?
}

以上代码报错 “错误 C2440:‘类型转换’:无法从‘B’转换为‘A’”。 是否可以在 C 中解决此错误?

【问题讨论】:

  • 您能解释一下为什么要这样做吗?你希望达到什么目标?
  • 古玩探索C
  • @VishvajeetT - 那么你的好奇心就会被一个简单的“你不能那样做”来满足。 C 不支持结构等价。阅读stackoverflow.com/questions/4486401/…
  • @StoryTeller 谢谢。另外,你能解释一下吗? B b = funcRetB();//Works B b = (B)funcRetB();// 错误 C2440: 'type cast' : 无法从 'B' 转换为 'B'。类型转换相同的数据类型(名称等效)如何产生错误?
  • 你用什么编译?我无法复制ideone.com/trCWXZ

标签: c


【解决方案1】:

我相信,但不能很快在标准中找到它,typedef 引入了一种只与自身兼容的新类型。

虽然 A 和 B 定义相同,但编译器会将它们视为不同的类型。当函数返回 B 类型的完整对象时,编译器现在不知道如何将其复制到 A 类型的对象。因为您复制了对象,所以强制转换不起作用,因为就编译器而言,所有成员的布局可能不同,因此编译器不知道如何将对象相互复制。

有关提示和技巧,请参阅 cmets 中提供的链接。

【讨论】:

  • 不,typedef 只为现有类型创建别名。但是结构定义确实创建了一个只与自身兼容的新类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 2012-06-10
  • 2021-07-20
相关资源
最近更新 更多