定义宏时`(...)`意味着什么?

时间:2014-06-09 01:28:06

标签: c++ c++11 c-preprocessor variadic-macros

我在虚幻引擎4的源代码中发现了这一点并且无法识别它。它的具体实例是:

#undef UCLASS

#define UCLASS(...) \
ARadialForceActor_EVENTPARM

我是一个相当新的程序员,这种宏对我来说并不熟悉。我的猜测是它定义了一个宏,它将采用函数UCLASS的每个重载版本(换句话说,名为UCLASS的函数的每个实例,无论参数的类型和数量如何)和将其替换为变量ARadialForceActor_EVENTPARM。那是对的吗?如果没有,有谁知道这意味着什么?我尝试编写代码片段来测试它,但它返回error: "." may not appear in macro parameter list。我将在下面包含它,以防我对宏的正确性,在这种情况下,如果有人能指出我的代码出错了,我将不胜感激:

#include <iostream>

#define foo( . . . ) bar

using namespace std;

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

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

   return 0;
}

2 个答案:

答案 0 :(得分:1)

您对#define foo(...) bar含义的猜测是正确的。您的错误是认为. . ....是相同的;他们不是。 ...必须写在点之间没有空格。如果我修改您的程序以阅读

#include <iostream>

#define foo(...) bar

using std::cout;

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

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

(请注意其他风格修正;您的代码的未来读者会感谢您)

然后我收到与foo()一致的错误消息,这些消息已被函数定义中的bar 替换,就好像你已经写好了

int bar
{
    cout << 54321 << '\n';
}
事实上,这就是告诉预处理器做的事情。 (预处理器一如既往地不了解正确语言的语法。)

答案 1 :(得分:0)

#define FOO(...)

这意味着您的宏可以接受可变数量的参数。有关详细信息,请参阅here