After looking at glibc nss code for a while, and also trying to understand how wined3d/device.c code updates pp* variables (it constructs the varname from a string pattern, and updates it), it is my opinion that macros are pure evil, and inline functions should be used everywhere instead.
..that's just my opinion as the "casual observer".