@ Грег прав, что в общем случае нужно писать явные функции сравнения.
Можно использовать memcmp
, если:
- структуры не содержат полей с плавающей точкой, которые, возможно,
NaN
.
- структуры не содержат отступов (для проверки используйте
-Wpadded
с clang) ИЛИ структуры при инициализации явно инициализируются memset
.
- нет типов элементов (таких как Windows
BOOL
), которые имеют различные, но эквивалентные значения.
Если вы не программируете для встраиваемых систем (или пишете библиотеку, которая может быть использована на них), я бы не стал беспокоиться о некоторых ключевых случаях в стандарте C. Различия ближнего и дальнего указателей не существует ни на одном 32- или 64-разрядном устройстве. Ни у одной из встроенных систем, о которых я знаю, нет нескольких NULL
указателей.
Другой вариант - автоматически генерировать функции равенства. Если вы выложите свои определения структуры простым способом, можно использовать простую обработку текста для обработки простых определений структуры. Вы можете использовать libclang для общего случая & ndash; поскольку он использует тот же внешний интерфейс, что и Clang, он правильно обрабатывает все угловые случаи (за исключением ошибок).
Я не видел такой библиотеки генерации кода. Тем не менее, это выглядит относительно просто.
Тем не менее, это также тот случай, когда такие сгенерированные функции равенства часто делают неправильные вещи на уровне приложения. Например, следует ли сравнивать две UNICODE_STRING
структуры в Windows поверхностно или неглубоко?