Пока я смотрел исходный код OVS, я обнаружил очень странные коды, которых никогда раньше не видел.
https://github.com/openvswitch/ovs/blob/master/lib/ovs-rcu.h
void ovsrcu_postpone__(void (*function)(void *aux), void *aux);
#define ovsrcu_postpone(FUNCTION, ARG) \
((void) sizeof((FUNCTION)(ARG), 1), \
(void) sizeof(*(ARG)), \
ovsrcu_postpone__((void (*)(void *))(FUNCTION), ARG))
Я понял значение нескольких аргументов sizeof, выполнив поиск
Зачем вызывать оператор sizeof с двумя аргументами? http://www.vxdev.com/docs/vx55man/diab5.0ppc/c-additi.htm#3001432
Если возврат FUNCTION - int, а тип ARG - char, макрос становится этой формой.
((void) 4, (void) 1, ovsrcu_postpone__((void (*)(void *))(function), arg))
Я не могу уловить роли двух аргументов перед методом ovsrcu_postpone__.
FUNCTION
иARG
перед тем, как отбросить их типы (используя их в неоцененном выраженииsizeof
, которое ничего не делает во время выполнения, но которое должно пройти проверку типов). Этакое «универсальное программирование». - person Mankarse   schedule 19.03.2015