Yes, it’s useful when generating code with the preprocessor, or doing tricks like Boost.PP does.
For an example, see X Macros. The basic idea is that the file contains the body of the macro and you #define
the arguments and then #include
it. Here’s a contrived example:
macro.xpp
std::cout << MESSAGE;
#undef MESSAGE
file.cpp:
int main() {
# define MESSAGE "hello world"
# include "macro.xpp"
}
This also allows you to use #if
and friends on the arguments, something that normal macros can’t do.