具有固定大小的未命名成员的结构

时间:2013-01-27 23:42:53

标签: c++ struct

我正在为游戏解析一些结构。我知道关于结构的大部分内容,但有各种我不知道的事情,我也不关心它们。但是我在解析时需要它们,所以事情排成一行。例如:

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

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

这是一个人为的例子,但它显示了我想要做的事情。我不想为成员unk1unk2命名。理想情况下,我想这样做

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

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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__)

答案 2 :(得分: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

答案 3 :(得分:0)

抱歉,但无法完成 你最定义名字!