Почему я не могу назначить взаимозаменяемо с двумя структурами, которые имеют идентичное содержание? - PullRequest
5 голосов
/ 13 апреля 2009

Я пытаюсь выучить C и наткнулся на что-то странное:

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

struct
{
  int i;
  double j;
} z;

Здесь вы можете видеть, что я создал два struct с одинаковыми элементами.

Почему при попытке назначить x = z будет выдана ошибка компиляции, а x = y - нет? Они имеют одинаковое содержимое, так почему я не могу назначать их друг другу взад и вперёд, независимо?

Можно ли как-нибудь это сделать, чтобы я смог назначить x = z? Или они просто должны быть одинаковыми struct.

Может ли какой-нибудь гуру C указать мне правильное направление?

Ответы [ 5 ]

13 голосов
/ 13 апреля 2009

Они имеют одинаковое содержание, но не одного типа. Если они предназначены для того же типа, просто typedef x z;. Если они не одно и то же, а просто содержат одни и те же поля, лучше создать отдельную функцию, которая будет правильно назначать поля.


Мой обычный стиль объявления структур в C включает typedef, поэтому я забыл упомянуть об этом (извините!). Вот синтаксис:

typedef struct
{
  int foo;
  double bar;
} x;

/* Further down, if needed */
typedef x z;
8 голосов
/ 13 апреля 2009

Создание одинаково структурированных типов одинаково называется " duck typing ". Это делается на некоторых языках, но не на C.

6 голосов
/ 13 апреля 2009

Компилятор не вычисляет «эквивалентность типов» между структурами, которые могут иметь одинаковую структуру, поэтому, насколько это касается, вторая структура не имеет ничего общего с первой.

Может делать x и y, потому что они объявлены одновременно.

Почему вы изменяете структуру? Вам, вероятно, следует один раз набрать определение структуры (например, в файле H), чтобы сделать ее фактическим типом, а затем объявить экземпляры.

Вот хороший учебник по typedefs для структур.

5 голосов
/ 13 апреля 2009
struct mystruct
{  
int i;  
double j;  
};

struct mystruct x, y;
struct mystruct z;

Если вы намереваетесь скопировать данные между ними, вы должны объявить их с одинаковыми идентификационными данными. У вас есть два объявления, не важно, что они равны для компилятора, это две разные структуры, и компилятор не должен обнаруживать их сходство.

0 голосов
/ 13 апреля 2009

C различает struct s по имени, и если они анонимны, то разные определения структуры различны.

Во всяком случае, классический C не допускает x = z, когда x и z являются структурами - это дополнение ANSI или C99? В любом случае, вы должны вместо этого использовать

#include <string.h>
memcpy(&x, &z, sizeof(x));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...