C缺少一个重要的特性

发布于 2022-10-15 08:44:13 字数 107 浏览 33 评论 0

本帖最后由 holyfire 于 2011-04-24 00:03 编辑

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

谎言月老 2022-10-22 08:44:13

本帖最后由 nketc 于 2011-04-24 01:08 编辑

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

裸钻 2022-10-22 08:44:13

回复 1# holyfire

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

写给空气的情书 2022-10-22 08:44:13

c的精髓正在与它的简洁

lz还是别学也别用c了

素年丶 2022-10-22 08:44:13

本帖最后由 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.     }

复制代码

彩扇题诗 2022-10-22 08:44:13

模板和虚函数都是多态

森罗 2022-10-22 08:44:13

void* 就是 C 的泛型。
zhujiang73 发表于 2011-04-24 11:56

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

月光色 2022-10-22 08:44:13

请直接用C++。。。

故人的歌 2022-10-22 08:44:13

回复 4# nketc

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

糖果控 2022-10-22 08:44:13

不要以C++的思维来使用C,C有自己的思维方式。看看linux kernel代码吧

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文