Well, not 100%, but they are sub-optimal.
Agree 100% about inline functions, if supported. Unfortunately, even when supported, inline is but a hint, and many programmers don't trust the compiler enough.
Indeed, on several of the compilers I use, if the function is called more than once and the "optimize for size" option is used (which is often the only reasonable choice for optimization for the rest of the code), "inline" is almost sure to be ignored. Note this isn't a bad thing. It's probably for the best. But some programmers don't like that idea at all...
Not sure I agree here. The only way to do that is to have multiple invocations of the parameters. Then someone is almost guaranteed to write something like
SMB_outb(*datarray++, adr++);
Which might have, um, surprising consequences. IME, this is far more likely than a collision with a well-chosen name local to a macro.
For the subject macro, I might have chosen SMB_outb__p rather than just __p.
Regards,
-=Dave