Почему я могу назначать структуры, но не сравнивать их

StackOverflow https://stackoverflow.com/questions/1882974

  •  19-09-2019
  •  | 
  •  

Вопрос

Несмотря на то, что я долгое время работаю программистом на C, я только недавно узнал, что можно напрямую присваивать структурные переменные друг другу вместо использования memcpy:

struct MyStruct a,b;
...
a = b; /* implicit memcpy */

Хотя это кажется немного "высокоуровневым" для C, это определенно полезно.Но почему я не могу сравнить равенство и неравенство:

if (a == b) ...
if (a != b) ...

Есть ли какая-либо веская причина для того, чтобы стандарт исключал это?Или это несоответствие в - в остальном очень элегантном - стандарте?

Я не понимаю, почему я могу заменить свои memcpy на чистые назначения, но я должен сохранить эти уродливые memcmp на месте.

Это было полезно?

Решение

В соответствии с часто задаваемые вопросы по comp.lang.c:

У компилятора нет хорошего способа реализовать сравнение структур (т.е.для поддержки оператора == для структур), что согласуется с низкоуровневой версией C.Простое сравнение по байтам может основываться на случайных битах, присутствующих в неиспользуемых "дырах" в структуре (такое заполнение используется для поддержания правильного выравнивания более поздних полей).Сравнение по полям может потребовать неприемлемого количества повторяющегося кода для больших структур.Любое сравнение, сгенерированное компилятором нельзя было ожидать сравнения полей указателей надлежащим образом во всех случаях:например, часто бывает уместно сравнивать поля char * с strcmp, а не с == .

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top