Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何声明具有不同字段数的类似结构?_C_Structure_Redefinition - Fatal编程技术网

C 如何声明具有不同字段数的类似结构?

C 如何声明具有不同字段数的类似结构?,c,structure,redefinition,C,Structure,Redefinition,我有两个标题需要定义两个类似的结构。一个结构应该与32字节对齐,另一个类似,但不需要与32字节对齐,这样我可以在这里节省一些内存。一个包含在另一个中。这是主标题 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;

我有两个标题需要定义两个类似的结构。一个结构应该与32字节对齐,另一个类似,但不需要与32字节对齐,这样我可以在这里节省一些内存。一个包含在另一个中。这是主标题

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
,每当我更改
mainstuct
而不是
pad[20]
时,所有其他字段都应该在
subStruct
中更新。也就是说,如果明天,我做
mainStruct
如下:

struct mainStruct
{
    int a;
    int b;
    int c;
    int d;
    char pad[16];
};
然后,它会自动反映在
sub_header.h
as中

struct subStruct
{
    int a;
    int b;
    int c;
    int d;
};
使用某种宏或其他预处理器指令是否有一种有效的方法

子结构应该总是从主结构派生,而不是从其他方面派生,这一点非常重要


谢谢。

< P>你有没有考虑过另一个方法?是否将
子结构
作为
主结构
中的一个元素?像这样:

struct sub {
    int a, b, c;
};
struct main {
    struct sub head;
    char dummy[16];
};
诚然,在
a
b
c
上确实需要额外一层语法,但内存布局和性能应该是相同的

否则,没有任何东西阻止您使用宏,正如您自己所建议的:

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

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

你是否考虑过另一条路?是否将
子结构
作为
主结构
中的一个元素?像这样:

struct sub {
    int a, b, c;
};
struct main {
    struct sub head;
    char dummy[16];
};
诚然,在
a
b
c
上确实需要额外一层语法,但内存布局和性能应该是相同的

否则,没有任何东西阻止您使用宏,正如您自己所建议的:

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

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

你是否考虑过另一条路?是否将
子结构
作为
主结构
中的一个元素?像这样:

struct sub {
    int a, b, c;
};
struct main {
    struct sub head;
    char dummy[16];
};
诚然,在
a
b
c
上确实需要额外一层语法,但内存布局和性能应该是相同的

否则,没有任何东西阻止您使用宏,正如您自己所建议的:

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

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

你是否考虑过另一条路?是否将
子结构
作为
主结构
中的一个元素?像这样:

struct sub {
    int a, b, c;
};
struct main {
    struct sub head;
    char dummy[16];
};
诚然,在
a
b
c
上确实需要额外一层语法,但内存布局和性能应该是相同的

否则,没有任何东西阻止您使用宏,正如您自己所建议的:

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

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

这就是为什么C++最初被发明的原因。但是如果你希望和普通C保持一致(可能有这样的决定理由),你可以检查GLUB/GOBUTE类型系统在一个宏集合上实现的宏。C.< /P> < P>,这就是C++最初被发明的原因。但是如果你希望和普通C保持一致(可能有这样的决定理由),你可以检查GLUB/GOBUTE类型系统在一个宏集合上实现的宏。C.< /P> < P>,这就是C++最初被发明的原因。但是如果你希望和普通C保持一致(可能有这样的决定理由),你可以检查GLUB/GOBUTE类型系统在一个宏集合上实现的宏。C.< /P> < P>,这就是C++最初被发明的原因。但是,如果您希望继续使用普通C(可能有这样的决定的原因),您可以检查GLib/GObject类型系统作为一组宏在普通C上实现。

您不能将mainStruct定义为类似struct subStruct{struct-mainStruct*mMainObj;}的子结构的成员吗?这里是否有可能使用
C++
,因为
C++
正是您需要的
继承
。您不能将主结构定义为类似struct subStruct{struct-mainstuct*mMainObj;}的子结构的成员吗?这里是否有可能使用
C++
,因为
C++
正是您需要的
继承
。您不能将主结构定义为类似struct subStruct{struct-mainstuct*mMainObj;}的子结构的成员吗?这里是否有可能使用
C++
,因为
C++
正是您需要的
继承
。您不能将主结构定义为类似struct subStruct{struct-mainstuct*mMainObj;}的子结构的成员吗?这里是否有可能使用
C++
,因为
C++
正好满足您的
继承要求。好吧,这可能是最简单的解决方案,不管这种方法中的大层次结构看起来有多丑陋。好吧,这可能是最简单的解决方案,不管这种方法中的大层次结构看起来有多丑陋。好吧,很可能这是最简单的解决方案,不管这种方法中的大层次结构看起来多么丑陋。好吧,很可能这是最简单的解决方案,不管这种方法中的大层次结构看起来多么丑陋。