C 确实有个悲剧的地方,也求方案。。。

中山野鬼 发布于 2012/07/09 00:36
阅读 3K+
收藏 2

需要对操作进行扩展定义,我暂时想不到如何能将下面的定义更简洁的表述方式。不知道诸位是否能给予建议。

#define __EQU(a,b,_T_)  (*(_T_*)(a) == *(_T_*)(b))
#define __EQU32(pa,pb) __EQU(pa,pb,u32)
#define __EQU64(pa,pb) __EQU(pa,pb,u64)
#define __EQUC(pa,C,_T_)  (*(_T_*)(pa) == (_T_)(C))
#define __EQUC32(pa,C) __EQUC(pa,C,u32)
#define __EQUC64(pa,C) __EQUC(pa,C,u64)

#define __GE(a,b,_T_)  (*(_T_*)(a) >= *(_T_*)(b))
#define __GE32(pa,pb) __GE(pa,pb,u32)
#define __GE64(pa,pb) __GE(pa,pb,u64)
#define __GEC(pa,C,_T_)  (*(_T_*)(pa) >= (_T_)(C))
#define __GEC32(pa,C) __GEC(pa,C,u32)
#define __GEC64(pa,C) __GEC(pa,C,u64)

写成这样,主要是防止日后,核心的数据结构产生差异。例如

typedef struct{
  u16 h;
  u16 t;
}_R_S;

#define __EQU_RS(pa,pb) __EQU32(pa,pb)

如果以后 改成

typedef struct{
  u64 h;
  u64 t;
}_R_S;

则可以简单替换

#define __EQU_RS(pa,pb) __EQU32(pa,pb)

#define __EQU_RS(pa,pb) (__EQU64(pa,pb)&&__EQU64(pa+1,pb+1))

大概是这个意思,毕竟实际代码并不是简单的16位或32位整型处理。上面只是解释我为什么这么变态如此写代码。我更关注前面的相似 #define是否有好的预处理描述方式实现。

加载中
1
hackee
hackee

引用来自“中山野鬼”的答案

引用来自“hackee”的答案

引用来自“中山野鬼”的答案

引用来自“hackee”的答案

不明白具体要干哈~

结构体的抽象操作?offsetof之类的宏好不好使?

 #define offsetof(s, m)   (size_t)&(((s *)0)->m)

哈。 &(((s*)0)->(m)) 不是你这么用的。。。你这样,对于运行态下是确定数据结构的时候并没有实际意义,这不是我在讨论的问题。我谈的是在系统原型开发时,数据结构在版本递进中,会出现调整,重组,上述做法是为了将算法和数据结构的关联度降低。

没看出来。。。你说的算法指的是啥?上面仅仅也就是些无意义的比较操作嘛。。。

算法本来就是依赖数据结构的,你对数据结构进行改动而不影响算法,结构的修改也不过是那些不影响算法的字段罢了。。。

重要的是封装,像windows里面那些内核对象,封装成一个句柄和一组api。

封装自然是需要。封装后,底层该忙不是还得忙吗?

算法本来是不依赖数据结构的。这点你需要注意。如果依赖数据结构,自然会出现依赖设备,或语言工具的等情况。同时,数据结构中,本身是无关联的东西,如果算法和数据结构的依赖或耦合度太高,他们自身也会产生关联,这会加大系统开发,调整的难度。

算法必须依赖数据结构。。。倒是数据结构可能设计为对设备等问题领域的抽象。。。

设备本身是通过把设备操作抽象为api接口来实现设备无关的。。。

照你这种逻辑,设备驱动程序都不用写了,直接一个抽象的算法全搞定

宏哥
宏哥
数据结构肯定和算法相关. 如果不相关,就一定可以用sizeof 解决.
0
mallon
mallon

感觉你本身的出发点就是错的,问题本身已经不是换类型这么简单的事情了,处理方式都有变化。比如以后如果改成u128(如果存在的话),是不是又要在宏后面加两个“&&”?

要我肯定用函数不用宏,想要效率,inline就是了

0
乌龟壳
乌龟壳
直接比较就可以了吧?为何比较要用宏来做呢?
0
十一文
十一文
貌似 没看到过好的方法,php的源代码中基本上也是这样
0
mallon
mallon
而且如果再继续发展下去,就成了第二个C++模板了,就会被很多人B4了,哈哈
hmly
hmly
++1
0
晓寒
晓寒

。。。汗,差点以为是我们以前项目里的代码,我们差不多也是这么搞的。

关注

0
中山野鬼
中山野鬼

引用来自“mallon”的答案

而且如果再继续发展下去,就成了第二个C++模板了,就会被很多人B4了,哈哈
哈。显然不会是C++模版。这么做本身是为了将数据结构和算法进行松耦合的一种设计。并不是面向对象。无非长得像点而已。面向对象,我还不知道,哪个敢只改基类,其他不该,项目照RUN的。
0
中山野鬼
中山野鬼

引用来自“郭煜”的答案

直接比较就可以了吧?为何比较要用宏来做呢?

如果一个系统,有N多个C文件,实现算法,实际写出来的都是针对具体数据结构的。不使用宏抽出对数据结构的基础操作,那么当这个结构产生新增,修改的时候,会额外增加很多维护工作量。甚至最后会局部代码推倒重来。

如果你写一个C工程,因为数据结构的调整,而几乎重写过代码,或许你能理解我这么设计的原因。。

0
LinkerLin
LinkerLin

这么麻烦何必用C?

ObjC或者C++都可以。

0
中山野鬼
中山野鬼

引用来自“LinkerLin”的答案

这么麻烦何必用C?

ObjC或者C++都可以。

哈 。C++做有些事情,相对C而言,太弱智了。。可悲的是这些事情正好我要做。
返回顶部
顶部