Max North
Max North

Reputation: 13

What does `(...)` mean when defining a macro?

I discovered this in the source code for the Unreal Engine 4 and didn't recognize it. The specific instance of it is:

#undef UCLASS

#define UCLASS(...) \
ARadialForceActor_EVENTPARM

I'm a fairly new programmer and this kind of macro is unfamiliar to me. My guess was that it is defining a macro that will take every overloaded version of the function UCLASS (in other words, every instance of a function named UCLASS, regardless of the type and number of parameters) and replace it with the variable ARadialForceActor_EVENTPARM. Is that correct? If not, does anyone know what it means? I tried writing a code snippet to test this, but it returned error: "." may not appear in macro parameter list. I'll include it below, in case I was right about the macro, in which case I would appreciate it if someone could point out where I went wrong in my code:

#include <iostream>

#define foo( . . . ) bar

using namespace std;

int foo() {cout <<54321<<endl;}

int main()
{  bar=12345;
   cout<<bar<<endl;

   return 0;
}

Upvotes: 1

Views: 479

Answers (2)

deeiip
deeiip

Reputation: 3379

#define FOO(...)

this means your macro can accept variable number of arguments. See here for details.

Upvotes: 0

zwol
zwol

Reputation: 140786

Your guess of the meaning of #define foo(...) bar is correct. Your error is in thinking that . . . and ... are the same; they are not. ... must be written with no spaces between the dots. If I modify your program to read

#include <iostream>

#define foo(...) bar

using std::cout;

int foo()
{
   cout << 54321 << '\n';
}

int main()
{
   bar = 12345;
   cout << bar << '\n';
   return 0;
}

(please take note of other stylistic corrections; future readers of your code will thank you)

then I get error messages consistent with foo() having been replaced with bar in the function definition, as if you had written

int bar
{
    cout << 54321 << '\n';
}

which is, in fact, what this tells the preprocessor to do. (The preprocessor, as always, has no understanding of the syntax of the language proper.)

Upvotes: 1

Related Questions