【问题标题】:Strange multiple class names in Linderdaum EngineLinderdaum 引擎中奇怪的多个类名
【发布时间】:2012-07-24 08:00:57
【问题描述】:

我正在尝试使用 Linderdaum 引擎,发现有很多奇怪的声明,例如:

class scriptfinal netexportable ClassName: public iObject

这些奇怪的名字scriptfinalnetexportable 是宏。但是它们被定义为空的。 为什么有人需要这种定义?

【问题讨论】:

    标签: c++ class linderdaum


    【解决方案1】:

    它们是空的,因此 C++ 编译器不会关心它们。

    Linderdaum 引擎对 C++ 源进行预处理,以生成有关类的元信息。

    这些宏最有可能被它们的预处理器用来为其脚本语言 (scriptfinal) 和 .NET 序列化代码 (netexportable) 生成信息。

    【讨论】:

    • 他们有一个预处理器——LSDC。我从源代码中删除了其中一些宏,并重新运行了rebuildlsd.py 脚本。输出改变了。看来你是对的。
    • 为了澄清事情,我必须说“scriptfinal”表示可能不是以脚本语言派生的类,“netexportable”实际上是指编组到 .NET 环境的类(但也作为可序列化的类)出于历史原因)。它们是空的,编译器会忽略它们。
    【解决方案2】:

    例如,有人可能将 scriptfinal 宏设置为:

    #define scriptfinal __declspec(dllimport)
    

    得到:

    class __declspec(dllimport) ClassName: public iObject {};
    

    由于 __declspec 是 Microsoft 特定的扩展,因此它通常用于可移植代码中的宏扩展。在为 Linux 环境编译时,宏是空的,所以 __declspec 对编译器不可见,在 Windows 下它们将按上述定义。

    【讨论】:

    • 是的,它们现在是空的。但是可以很容易地将它们更改为非空宏以生成某种类型的代码[在不同的平台/硬件中]。
    • 听起来很合理。但是为什么要用两个宏呢?
    • 我检查了源代码,没有证据表明 Linux/Windows 有不同的定义。你错了:(
    • 宏可以在编译时通过编译器的参数设置。
    • @jrok:检查 gcc 详细输出 - 宏为空。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    相关资源
    最近更新 更多