[问题] struct alignment

楼主: DJWS (...)   2019-12-11 07:58:43
// C99
struct SuperClass {
int num;
};
struct ClassA {
int num;
int a;
};
struct ClassB {
int num;
int b;
};
struct ClassA objA = {
.num = 0,
.a = 0
};
struct ClassB objB = {
.num = 0,
.b = 0
};
void func(void* obj)
{
struct SuperClass* object = obj;
object->num++;
}
int main(void) {
func(&objA);
func(&objB);
return 0;
}
我想做类似的事情,请问在C99要怎么写?
不能使用malloc
作者: sarafciel (Cattuz)   2019-12-11 09:05:00
呃 你贴了一段C99的code 然后问说在C99怎么写?XD
作者: SocketAM2 (AM2)   2019-12-11 09:15:00
用union可以规格上保证对,但上面这样我只是找不到对应的文件而已,看起来也挑不出错…
楼主: DJWS (...)   2019-12-11 09:24:00
我不确定这样写对不对 只是凭感觉写的...另外 当SuperClass内容很多 我想知道如何精简ClassA和B
作者: Lipraxde (Lipraxde)   2019-12-11 10:22:00
macro 把里面重复的包一包?
楼主: DJWS (...)   2019-12-11 10:33:00
有更优雅的方法吗?我刚发现 #pragma anon_unions 感觉不错
作者: sarafciel (Cattuz)   2019-12-11 11:01:00
那你为啥不把SuperClass塞进CLassA跟B里面?
楼主: DJWS (...)   2019-12-11 11:10:00
多很多字 不好读 C99不支援anonymous struct/union楼上你看起来还没进入状况 你实际写一遍就会知道问题在哪了然后我也想知道如何精简 initializer list
作者: a58524andy (a58524andy)   2019-12-11 13:06:00
作者: Bencrie   2019-12-11 13:10:00
我相信很多人都干过 C 模拟 class,没有搞不清楚这回事XD不然你去读 gobject 的 source code 看有没有比较好读
楼主: DJWS (...)   2019-12-11 13:13:00
我目前就是这样写的 但是需要 #pragma anon_unions我也相信很多人都干过C模拟class 但我觉得s还没进入状况XD然后我是第一次用C模拟class 我之前都写C++...
作者: Bencrie   2019-12-11 13:20:00
是喔,那我大概也没进入状况吧
楼主: DJWS (...)   2019-12-11 13:20:00
然后 gobject 跟这件事的关联在哪?我应该看哪一段code?
作者: sarafciel (Cattuz)   2019-12-11 21:34:00
我是不知道你想拿anonymous struct/union来做什么啦https://ideone.com/6lm4Vh 我也不知道这样写有什么大问题 你可以说说看 我是真的不懂就是XD
楼主: DJWS (...)   2019-12-12 07:07:00
因为要多打.base啊 多很多字 不好读这也就是C11要引进anonymous struct/union的原因29行名称不一致 有的要写.base 有的不用写 维护困难如果再多做几层composition 敲键盘就敲到崩溃了 XD
作者: Lipraxde (Lipraxde)   2019-12-12 07:27:00
那就再继续用 macro 包啊
楼主: DJWS (...)   2019-12-12 07:46:00
楼上可以示范一下怎么用 marco 包吗?macro
作者: sarafciel (Cattuz)   2019-12-12 16:00:00
https://ideone.com/1fg4hL 用函式也行 再包就好啦
楼主: DJWS (...)   2019-12-12 18:14:00
你这样没有解决问题喔本来要判断.base 现在变成要判断Base_Print只存取num 要选Base_Print 只存取a 要选DerivedA_Print
作者: sarafciel (Cattuz)   2019-12-12 20:26:00
我本来就不认为那个是问题呀XDProgrammer本来就该意识自己在存取的是父类还是子类从这层意义上讲 那个base留着才是可读性高的写法毕竟我可以透过看有没有base去推断要去父还是子找定义只是继承炼深的情况下重复写base很烦我同意
楼主: DJWS (...)   2019-12-12 20:27:00
无法承认自己的无知 这样不好喔 您多保重
作者: sarafciel (Cattuz)   2019-12-12 20:27:00
所以用包函数的方式去把某个动作拆成分层的子问题然后把定锚父子这件事用型态来解决
作者: loveme00835 (发箍)   2019-12-12 20:39:00
ADT 的概念那么差还谈 OO xD
楼主: DJWS (...)   2019-12-12 20:47:00
楼上离题了吧
作者: loveme00835 (发箍)   2019-12-12 21:04:00
因为你根本搞不清楚你要做什么, 先把 data oriented搞成 object oriented, 所以型别命名就错掉了. object oriented 着重在 service/behavior 所以真正多型的地方是用 function 来实作, 而不是资料. 如果是 dataoriented 你的宣告方式就错了. 顺便一提这条超简单,我回家再贴关键字 “macro metaprogramming”
楼主: DJWS (...)   2019-12-12 21:13:00
所以我猜...你应该知道我要做什么? XD
作者: loveme00835 (发箍)   2019-12-12 22:54:00
作者: Bencrie   2019-12-13 01:44:00
哇赛开始呛人了 XDgobject system 就是 glib 实作的“C 模拟 class”不过它模拟的是那个 OO 行为,不是语法糖
楼主: DJWS (...)   2019-12-13 07:15:00
包成macro原来需要补充这么多东西 有更优雅的方法吗?对 我就是在问语法糖啊 在C99底下 你得到他了...然后我的文章标题问的是 strcut aligment 我压根没想问OOstruct
作者: loveme00835 (发箍)   2019-12-13 08:50:00
但是你的型别就是 OO 的命名风格, 但作的是 DO更优雅? 你何不把共用的 variable 增加到 1k 个看看?
楼主: DJWS (...)   2019-12-13 08:56:00
因为这个案子不会到1k个(内存不够用) 目前就20个而已但是derived class目前就有10个 以后还会越来越多我修正一下 目前有10个derived class 而且将陆续增加程式码长的很惊人 很难维护 所以想问更精简的写法
作者: loveme00835 (发箍)   2019-12-13 09:01:00
如果是一般作法就会是用很简单的 nested struct 去实
楼主: DJWS (...)   2019-12-13 09:02:00
然后OO命名风格...这就当作是我的错误吧 我应该怎么命名呢?
作者: loveme00835 (发箍)   2019-12-13 09:02:00
作, 各自去 maintain 自己的 offset, 但是都可以注册同样 prototype 的 accesor function 去操作, 所以根本不需要重复的程式码, 好不好维护完全是设计问题,
作者: Bencrie   2019-12-13 09:05:00
那你就写 code generator 吧。维护的时候用你爱的语法
作者: loveme00835 (发箍)   2019-12-13 09:05:00
你硬要用 designated initializer 来初始化物件那这样势必要有展开的动作
作者: Bencrie   2019-12-13 09:06:00
要编译的时候转成你觉得很丑的 C99 实作
作者: loveme00835 (发箍)   2019-12-13 09:08:00
所以问题就是, 你不知道你卡的点在哪, 但是别人提的
作者: Bencrie   2019-12-13 09:08:00
是说干嘛不直接用 C++? toolchain 不给用吗
作者: loveme00835 (发箍)   2019-12-13 09:09:00
方案能解只是需要其他 work, 你不知道也不想作, 因为你想像的 C99 跟别人的很不一样
楼主: DJWS (...)   2019-12-13 09:14:00
两位交互诘问我很难回答 XD 我先回答Bencrie板友吧我的部分是开发算法 原始程式码是javascript 以便可视化并且修正算法 然后再移植到mcu上面 但是雇主提供的开发环境只有C99没有C++再来是loveme前板主 num a b 这些都是算法参数将来会从外部输入到mcu 但是还没跟雇主讨论这一块要怎么做于是我暂先弄个initializer 以便测试算法是否能正常运作好了言归正传 请问DO风格之下 我应该怎么命名才对呢?
作者: descent (“雄辩是银,沉默是金”)   2019-12-13 13:17:00
#1QlX0DOR 该篇的 cfront 可以解决你的问题吗?
楼主: DJWS (...)   2019-12-13 13:46:00
我第一次听到 cfront 我下次遇到雇主跟他聊一下刚刚谷歌一阵 cfront是上古时代的东西吧 有点不太现实
作者: descent (“雄辩是银,沉默是金”)   2019-12-13 14:23:00
想说你只是要处理 class 继承的语法, 所以才提 cfront
作者: ofd168 (大色狼来袭)   2019-12-15 15:47:00
大家脾气真好,只有我觉得D回文很呛吗
作者: reemir   2019-12-15 21:04:00
:)
楼主: DJWS (...)   2019-12-15 21:31:00
如果各位都觉得我口气不好 那我道歉 对不起各位
作者: eye5002003 (下一夜)   2019-12-15 22:25:00
我也有上来讨论过类似的话题,试图让C语言可以别写的又臭又长,最后都是宣告放弃,C就是要写的伤眼又费力进入C++11的世界之后又更加无法忍受C了
作者: KevinR (Kevin)   2019-12-17 10:20:00
...
作者: xvid (DivX)   2019-12-18 08:35:00
客气客气
作者: xkhsky (30CM)   2019-12-19 22:31:00
笑死

Links booklink

Contact Us: admin [ a t ] ucptt.com