虚幻引擎如何实现UPROPERTY宏?

5

我希望在我的项目中实现类似于UPROPERTY()宏的东西,但是我找不到任何关于它是什么的参考资料。我的意思是,有一些关于这个宏如何工作的教程,但这些只是使用案例。

编译器是如何知道UPROPERTY()引用其下面的变量的?

例如:

UPROPERTY(EditAnywhere)
int x = 0;

我知道虚幻引擎是开源的,但它的代码库非常庞大。


你有学习宏的参考资料吗?我已经掌握了一些基础知识(函数、类),并且还使用了基于宏的泛型编译时类型描述器类实现了 https://philippegroarke.com/posts/2022/data_driven_descriptor_based_generative_cpp/,所以我需要更高级的东西。但是当我搜索更高级的内容时,总是得到一些简单的 #define、#if、#ifdef 示例,这些我已经知道了。 - Edziju
1个回答

7

UPROPERTY 不是一个真正的 C++ 宏。虽然它看起来像一个宏,编译器也能够接受它,但实际上它是由Unreal Header Tool (UHT) 用来创建您类的GENERATED_BODY代码中要添加的代码。UHT是一个解析器,它只需获取您的所有代码并搜索所有那些 UCLASS, UPROPERTY, UFUNCTION等声明,然后生成相应的代码,最后将其放入 "XXX.generated.h" 和 "XXX.generated.cpp" 文件中,这些文件会被包含在您的项目中。例如,如果您希望通过蓝图访问变量,则会创建一个 getter 逻辑,以允许蓝图逻辑调用。

因此,编译器实际上并不知道 UPROPERTY 是什么,因为预处理程序完全删除了它,因为它没有一个实际的主体。

如果您想深入了解UHT的工作原理,您可以查看其代码。您还可以修改它以满足您的需求,包括自定义代码生成。


关于 Unreal 中的宏的附注:Unreal 中的 Slate 框架实际上使用宏来生成大量样板代码,无需使用 Unreal Header Tool。也许研究一下它会给您一些洞见。但它们与 UHT 进行的代码生成的强大程度并不相同。


感谢您深入浅出的解释。我一定会查看您提供的代码。 - Edziju

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接