Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

В comp.lang.c FAQ:

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

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