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