Macros aren't functions. They merely perform a text replace on the code.
Your example would be correctly written as:
1 2 3
#define PRINT(x,y) myprtinf((x),(y))
//The extra parenthesis are preferable. Notice how none of the parameters are
//typed.
Suppose somewhere in your code you write PRINT("text",etc). After preprocessing, the code will look like this: myprtinf(("text"),(etc))
Macros don't work with the ... syntax (I can't what that is called, right now).
See the post above - macros don't work with ellipsis.
On that matter, don't use the ellipsis at all if you can help it (you most likely always can) and _DON'T_USE_MACROS_. They are _EVIL_. May everyone's soul who wrote a macro in a piece of code I have to work with burn in hell for eternity. Supose something simple as a the substitution of builtin bool with these defines:
1 2 3
#define bool int
#define true 1
#define false 0
Have fun debugging if you have a variable named false anywhere (which is entirely legal and possible and won't result in any compiler error). And have fun overloading functions with bool and int parameters:
Plus, macros don't obey namespaces, which is a pain-in-the-ass at best.
Corollary: for output, use operator<< and you don't need the '...'. If you feel you really need a function with two names, use a wrapper (I don't see the point, though, as anyone reading the code has now to remember two names for the same function).