- 1
- 2
- 3
- 4
- 5
#define InlineIsEqualGUID(rguid1, rguid2) \
(((unsigned long *) rguid1)[0] == ((unsigned long *) rguid2)[0] && \
((unsigned long *) rguid1)[1] == ((unsigned long *) rguid2)[1] && \
((unsigned long *) rguid1)[2] == ((unsigned long *) rguid2)[2] && \
((unsigned long *) rguid1)[3] == ((unsigned long *) rguid2)[3])
Либо я не прав? И это говно хотябы один стандарт поддерживает?
C89 вроде как в нем все-таки есть.
В чем вопросики заключаются, если не секрет?
Из минусов кода:
- Железобетонная привязка к 32 битному unsigned long. Из-за таких, простите, питушков, мс и оставило long 32 битным даже на x86-64.
- Макрос назван как функция (не капсом), но в то же время вычисляет свои аргументы от 1 до 4 раз. Может привести к веселым последствиям, если кто-то "оптимизирует" код, и подставит вызов функции в один из параметров макро.
Раскрой маркос. Там rguid не обернуты скобками
А ну да, туплю, вы правы. Оно еще и забагует на guid_array + i, смещаясь по 4 байта вместо 16...
В любом случае аффтар сего макроса не знал основ макроёбства :)
Собственно после встречи с этой "фичей" IRL захотелось поделиться этой макрой.