我在虚幻引擎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;
}
您对的含义的猜测#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';
}
实际上,这就是告诉预处理器执行的操作。(与往常一样,预处理器不了解该语言本身的语法。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句