【问题标题】:Why can I not assign interchangeably with two structs that have identical contents?为什么我不能与具有相同内容的两个结构互换分配?
【发布时间】:2010-10-19 04:07:21
【问题描述】:

我正在尝试学习 C,但遇到了一些奇怪的事情:

struct
{
  int i;
  double j;
} x, y;

struct
{
  int i;
  double j;
} z;

在这里,您可以看到我创建了两个元素相同的structs。

为什么当我尝试分配x = z 时会产生编译错误而x = y 不会?它们具有相同的内容,那为什么我不能将它们来回分配呢?

有什么办法可以让我可以分配x = z?或者他们只是必须是相同的struct

任何 C 大师都可以为我指明正确的方向吗?

【问题讨论】:

    标签: c struct


    【解决方案1】:

    使结构相同的类型相同称为“duck typing”。这是在某些语言中完成的,但不是在 C 中。

    【讨论】:

    • “如果它走路像鸭子,叫起来像鸭子,我就叫它鸭子。”
    【解决方案2】:

    它们的内容相同,但类型不同。如果它们打算属于同一类型,只需 typedef x z;。如果它们不是同一个东西,只是恰好包含相同的字段,最好创建一个单独的函数来正确分配字段。


    我在 C 中声明结构的常用风格包括 typedef,所以我忘了提及它(对不起!)。语法如下:

    typedef struct
    {
      int foo;
      double bar;
    } x;
    
    /* Further down, if needed */
    typedef x z;
    

    【讨论】:

    • 当你说 typedef x z;这是如何运作的?您能否详细说明您的意思,以便我可以对结构进行 typedef 并创建它的实例?
    【解决方案3】:

    C根据名字区分structs,如果是匿名的,那么不同的结构定义就不一样了。

    无论如何,当xz 是结构时,经典C 不允许x = z - 这是ANSI 还是C99 的添加?无论如何,您应该改用

    #include <string.h>
    memcpy(&x, &z, sizeof(x));
    

    【讨论】:

      【解决方案4】:

      编译器不会计算可能具有相同结构的结构之间的“类型等价”,因此就它而言,第二个结构与第一个无关。

      它可以做 x 和 y,因为它们是同时声明的。

      为什么要重新声明 struct ?您可能应该对结构进行一次类型定义(例如,在 H 文件中)以使其成为实际类型,然后声明实例。

      Here's a good tutorial on typedefs for structs.

      【讨论】:

        【解决方案5】:
        struct mystruct
        {  
        int i;  
        double j;  
        };
        
        struct mystruct x, y;
        struct mystruct z;
        

        如果你打算在它们之间复制数据,你必须用相同的身份声明它们。你有两个声明,对于编译器来说它们相等并不重要,它们是两个不同的结构,编译器不应该检测它们的相似性。

        【讨论】:

          猜你喜欢
          • 2021-05-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-20
          • 2021-09-25
          • 2020-05-04
          • 2017-07-29
          • 2014-12-06
          相关资源
          最近更新 更多