什么是“(.' 表示定义宏时
What does `(...)` mean when defining a macro?
我在虚幻引擎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';
}
事实上,这就是这告诉预处理器要做的事情。 (与往常一样,预处理器不了解语言的语法。
#define FOO(...)
这意味着您的宏可以接受可变数量的参数。详情请看这里。
相关文章:
- 未定义的引用(但 nm 表示该函数存在)
- GCC ARM 交叉编译,像未定义的引用"__cxa_end_catch@CXXABI_1.3"这样的错误表示什么?
- 为什么使用构造函数调用表示法定义指向指针变量的指针是非法的
- C++:定义类函数的.cpp文件中实例本身的表示关键字
- 将使用预处理器指令来定义美元符号表示的内容会导致任何冲突
- 如何使用大值表示C++中未定义的数字
- 如何定义用于表示二维坐标的模板之间的转换
- 如何用自定义比较表示一组指针,但保持原始原始指针的重复比较
- 使用UML表示在C++模板类中定义的typedef
- 优先级队列自定义比较器的返回值表示什么
- 类型定义 表示可以包含size_t的有符号类型
- 对象表示形式的定义和运算符sizeof
- getenv()表示定义的环境变量只有在Eclipse中运行时才未定义
- 自定义实现具有位表示的bool向量-如何实现运算符[]
- 定义线程函数时的Std::thread表示法
- 如何在c++中定义一个结构类型来表示名字和邮政编码的组合
- 什么是“(.' 表示定义宏时
- 对以下用户定义类片段中的模板实例化问题表示怀疑
- 目标 c - 如何在 c++ 语言 / getdate() 中定义表示时间值的值
- 如何获得表示未定义值的c++