C 如何声明具有不同字段数的类似结构?
我有两个标题需要定义两个类似的结构。一个结构应该与32字节对齐,另一个类似,但不需要与32字节对齐,这样我可以在这里节省一些内存。一个包含在另一个中。这是主标题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;
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++
正好满足您的继承要求。好吧,这可能是最简单的解决方案,不管这种方法中的大层次结构看起来有多丑陋。好吧,这可能是最简单的解决方案,不管这种方法中的大层次结构看起来有多丑陋。好吧,很可能这是最简单的解决方案,不管这种方法中的大层次结构看起来多么丑陋。好吧,很可能这是最简单的解决方案,不管这种方法中的大层次结构看起来多么丑陋。