1

我在虚幻引擎 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;
}
4

2 回答 2

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';
}

实际上,这就是告诉预处理器要做的事情。(与往常一样,预处理器不了解语言本身的语法。)

于 2014-06-09T01:33:44.183 回答
0
#define FOO(...)

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

于 2014-06-09T01:33:50.877 回答