最近一个项目做得想吐血,逻辑很简单,到最后剪裁,那些脑子进了水的老大各种馊主意,代码改过来改过去。
介绍下背景,我们是做网络设备的,大致设备的物理形态有五种A,B,C,D,E,而跑在这五种物理设备上的逻辑结构有四种,
为了剪裁的需要,我最初是这么做的,我不管什么逻辑形态,反正我的 .c最终编到五种物理设备上,我就按物理形态划分文件,函数内再区分逻辑形态。最近一次给审回来说我冗余代码太多,我就给他理论了一番,说我从每种设备看根本没有冗余代码,把5个.c混到一起当然有冗余,为避免冗余我把公共流程放到了一个文件,建立另一个文件xxx_xxx_GetMethod.c放了几个xxx_GetxxMehtod用函数指针来返回具体物理设备上的处理办法,还是不满意,暗示我把五个xxx_xxx_GetMethod.c合并成一个,我说会有链接问题,因为我调了别人的函数,接着暗示我说用这个,
__attribute__((weak)),我说没见过,才疏学浅,真没见过,他给讲了讲,明白是把函数变成了弱符号,因为我调用了别人四个接口,就在自己的文件里造了四个相同的弱符号桩,生生用丑陋的switch case把五个文件合成一个文件。发现,唉倒是能编译通过,但是我看着自己写的那四个只是用来骗编译器不出链接错误的桩,就感觉代码很恶心,因为我的逻辑已经保证那些弱符号根本没机会调到,那些弱符号除了骗过编译器不出链接错误啥也没干。
有几个问题请教几位大牛:
1.在这种我们的系统会跑到几种不同物理设备形态上的进行剪裁时,难道不是尽量让每种物理设备形态上都有尽量少的冗余,非要很恶心的处理成一个万能解决方案吗?这样看起来没代码冗余,其实是真冗余,而且以后有人问我那四个空函数是干啥的,我无言以对,我只能说就是为了骗骗连接器。
2. 我倒能想到__attribute__((weak))真正有用的情形,就是处理策略有两种,一种是默认策略,一种是备选策略,当需要备选策略时就将备选策略作为强符号编进来就把默认策略盖了,我想GCC的大腕们是拿他来干这种正事的,而不是像我这么卑鄙蒙编译器的吧。
3.或者我还能想到的是,默认的确是空,就是没有该功能,然后引入强符号增加该功能,剪裁会方便点,不用修改代码。
小弟才疏学浅,还希望高人能指教
另外,我在任何c语言书都没看到过__attribute__((weak))这个东东,他是GCC 独有的吗?