【问题标题】:How to declare similar structure with different number of fields?如何声明具有不同数量字段的类似结构?
【发布时间】:2014-02-13 04:50:26
【问题描述】:

我有 2 个标头需要定义 2 个类似的结构。一种结构应该与 32 字节对齐,另一种类似但不需要与 32 字节对齐,因此我可以在这里节省一些内存。一个包含在另一个中。这是main_header.h

struct mainStruct
{
    int a;
    int b;
    int c;
    char pad[20];
};

下面是sub_header.h

#include "main_header.h"

struct subStruct
{
    int a;
    int b;
    int c;
};

现在我想做的是定义subStruct,只要我更改mainStruct而不是pad[20],所有其他字段都应该在subStruct中更新。也就是说,如果明天,我把mainStruct 变成这样:

struct mainStruct
{
    int a;
    int b;
    int c;
    int d;
    char pad[16];
};

然后,它应该自动反映在sub_header.h

struct subStruct
{
    int a;
    int b;
    int c;
    int d;
};

有没有使用某种宏或其他预处理器指令的有效方法?

并且 subStruct 应该始终从 mainStruct 派生而不是其他方式,这非常重要。

提前致谢。

【问题讨论】:

  • 你不能将 mainStruct 定义为 subStruct 的成员,例如 struct subStruct{ struct mainStruct * mMainObj;}; ?
  • 这里是否有可能使用C++,因为C++ 正是您所需要的Inheritance

标签: c structure redefinition


【解决方案1】:

您是否考虑过相反的方法?包括subStruct 作为mainStruct 中的一个元素?像这样:

struct sub {
    int a, b, c;
};
struct main {
    struct sub head;
    char dummy[16];
};

的确,在abc 上确实需要额外的语法层,但内存布局和性能应该相同。

否则,没有什么可以阻止您使用宏,正如您自己建议的那样:

#define SUB_FIELDS int a; int b; int c;

struct main {
    SUB_FIELDS
    char dummy[16];
};
struct sub {
    SUB_FIELDS
};

【讨论】:

  • 嗯,这可能是最简单的解决方案,但是在这种方法中大的层次结构看起来很丑。
【解决方案2】:

嗯,这就是最初发明 C++ 的原因。但是,如果您希望继续使用纯 C(可能有这样的决定的原因),您可以检查 GLib / GObject 类型系统实现为一组宏而不是纯 C。

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 2014-01-06
    • 2018-06-06
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多