1

我正在为游戏解析一些结构。我知道关于结构的大部分事情,但也有很多事情我不知道,我也不真正关心它们。但我在解析中需要它们,这样事情就可以排列起来。例如:

template <unsigned int Size>
class unknown
{
    BYTE data[Size];
};

struct s_object
{
    int stuff;
    unknown<100> unk1;
    int otherstuff;
    unknown<200> unk2;
};

这是一个人为的例子,但它显示了我正在尝试做的事情。我不喜欢必须命名成员unk1,然后unk2。理想情况下,我想这样做

 struct s_object
    {
        int stuff;
        unknown<100>;
        int otherstuff;
        unknown<200>;
    };

但这当然行不通。编译器有没有办法生成一个随机名称,不使用名称,或者只是将其视为填充?

4

4 回答 4

2

编辑:即使 GCC 也不允许你这样做!已更正。

一般来说,没有。如果您真的想的话,您可以使用__FILE__,__LINE__和/或__COUNTER__ (后者是另一个编译器扩展,但在 GCC 和 MSVC 等中支持)组合一个宏来为您命名字段。

于 2013-01-27T23:47:25.120 回答
1

您可以使用__COUNTER__宏(但需要一些预处理器技巧)。它由GCCVisual C++和可能的其他人实现。

然后,您可以定义一个名为的宏,例如在使用时_扩展为类似的东西_unused_15_unused_16依此类推。有了它,您的代码将变为:

struct s_object
{
    int stuff;
    unknown<100> _;
    int otherstuff;
    unknown<200> _;
};

诡计是,即

#define CAT(a,b)           a##b
#define CAT_DELAYED(a,b)   CAT(a,b)
#define _                  CAT_DELAYED(_unused_,__COUNTER__)
于 2013-01-27T23:52:35.897 回答
1

如果您真的必须“自动”执行此操作,则可以执行以下操作:

#define UNKNOWNY(line, size) char unknown_##line[(size)]
#define UNKNOWNX(line, size)  UNKNOWNY(line, size)
#define UNKNOWN(size)   UNKNOWNX(__LINE__, size)

但我真的不明白这比写作好得多char unknown1[100]。您知道的时间并不长 - 您可以随时复制/粘贴。

编辑:添加额外的#define.

于 2013-01-27T23:52:50.807 回答
0

对不起,但它不能做到你最定义的名字!

于 2013-01-27T23:46:23.027 回答