免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3828 | 回复: 14
打印 上一主题 下一主题

C缺少一个重要的特性 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-23 23:41 |只看该作者 |倒序浏览
本帖最后由 holyfire 于 2011-04-24 00:03 编辑

C缺少一个重要的特性,就是template和泛型编程......

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
2 [报告]
发表于 2011-04-24 00:19 |只看该作者
本帖最后由 nketc 于 2011-04-24 01:08 编辑

引入lz所说的 会同时带来很多其它问题,c就是令一个c++了。

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
3 [报告]
发表于 2011-04-24 04:04 |只看该作者
回复 1# holyfire


    C缺少的特性多了他妹的去了。单是没有名字空间这一点就足够口水它了。再加上异常处理机制也没有啊,异常处理机制很重要的说。OOP嘛可以容忍反正C也能OOP是吧。你还非想用C泛型。泛型也不一定非要用template的,你可以定义一个公共基础类/结构体嘛,所有的类型就继承自这个公共基础类,这就是Java这种垃圾所谓的实现泛型的做法嘛。你还想要自动类型推导不?C++0x标准重新使auto关键字焕发青春,使得可以自动推导对象类型 -- 这个特性你想要不?这你妹好的重要的特性真他妹的多啊,都加进C吧 -- 答案是,不是把这些特性加到C里面去,而是去用C++...

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
4 [报告]
发表于 2011-04-24 10:00 |只看该作者
c的精髓正在与它的简洁

lz还是别学也别用c了

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
5 [报告]
发表于 2011-04-24 11:56 |只看该作者
本帖最后由 zhujiang73 于 2011-04-24 12:10 编辑
C缺少一个重要的特性,就是template和泛型编程......
holyfire 发表于 2011-04-23 23:41



    void* 就是 C 的泛型。 {:3_189:}
  1.     #include <stdio.h>
  2.     #include <stdlib.h>

  3.     typedef struct  _GTBase
  4.     {
  5.             void  (*add)(void *pthis, void *p);
  6.     } GTBase;

  7.     typedef struct  _GTInt
  8.     {
  9.             GTBase  base;
  10.             int     data;
  11.     } GTInt;

  12.     typedef struct  _GTDouble
  13.     {
  14.             GTBase   base;
  15.             double   data;
  16.     } GTDouble;

  17.     void  add_int(void *pthis, void *p)
  18.     {
  19.             GTInt  *p_gthis = (GTInt*)pthis;
  20.             GTInt  *p_gp = (GTInt*)p;

  21.             p_gthis->data = p_gthis->data + p_gp->data;
  22.     }

  23.     void  add_double(void *pthis, void *p)
  24.     {
  25.             GTDouble  *p_gthis = (GTDouble*)pthis;
  26.             GTDouble  *p_gp = (GTDouble*)p;

  27.             p_gthis->data = p_gthis->data + p_gp->data;
  28.     }

  29.     void  gtint_init(GTInt  *p_gthis)
  30.     {
  31.             GTBase  *p_base = (GTBase*)p_gthis;

  32.             p_base->add = add_int;
  33.     }

  34.     void  gtdouble_init(GTDouble  *p_gthis)
  35.     {
  36.             GTBase  *p_base = (GTBase*)p_gthis;

  37.             p_base->add = add_double;
  38.     }

  39.     void  add(void* pina,  void* pinb,  void* pout)
  40.     {
  41.             GTBase  *pb_out = (GTBase*)pout;

  42.             pb_out->add(pout, pina);
  43.             pb_out->add(pout, pinb);
  44.     }

  45.     int  main()
  46.     {
  47.             GTInt      ia,ib,ic;

  48.             gtint_init(&ia);
  49.             gtint_init(&ib);
  50.             gtint_init(&ic);

  51.             ia.data = 2;
  52.             ib.data = 3;
  53.             ic.data = 0;

  54.             add((void*)&ia, (void*)&ib, (void*)&ic);

  55.             printf("ia=%d, ib=%d, ia+ib=%d\n\n", ia.data, ib.data, ic.data);


  56.             GTDouble   da,db,dc;

  57.             gtdouble_init(&da);
  58.             gtdouble_init(&db);
  59.             gtdouble_init(&dc);

  60.             da.data = 1.1;
  61.             db.data = 2.5;
  62.             dc.data = 0.0;

  63.             add((void*)&da, (void*)&db, (void*)&dc);

  64.             printf("da=%f, db=%f, da+db=%f\n\n", da.data, db.data, dc.data);

  65.             return 0;
  66.     }
复制代码

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
6 [报告]
发表于 2011-04-24 13:26 |只看该作者
模板和虚函数都是多态

论坛徽章:
0
7 [报告]
发表于 2011-04-24 15:17 |只看该作者
void* 就是 C 的泛型。
zhujiang73 发表于 2011-04-24 11:56



    真麻烦哪,要写5个函数才行,不如直接写了

论坛徽章:
0
8 [报告]
发表于 2011-04-24 15:26 |只看该作者
请直接用C++。。。

论坛徽章:
0
9 [报告]
发表于 2011-04-24 15:42 |只看该作者
回复 4# nketc


C简洁。。。
你耐性真好。╮(╯_╰)╭

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
10 [报告]
发表于 2011-04-24 17:32 |只看该作者
不要以C++的思维来使用C,C有自己的思维方式。看看linux kernel代码吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP