免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Patagonia
打印 上一主题 下一主题

[C++] 关于C语言,我喜欢和讨厌的十件事 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
41 [报告]
发表于 2013-11-18 09:24 |只看该作者
yulihua49 发表于 2013-11-15 16:32
没有实力,无法炒作。
你研究一下Hibernate,-- 一个ORM,Object Relational Mapping。
可以将对象映射 ...

c/c++做orm,也很简单。最简单就用文件配置struct。如果要想更方便,用宏来生成这个struct就可以了。
从效率讲,比反射快得多。就是一个offset而已。反射的快慢,与jvm的实现相关。最快也得查表,怎么都比offset慢得多。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
42 [报告]
发表于 2013-11-18 19:14 |只看该作者
truekbcl 发表于 2013-11-18 09:24
c/c++做orm,也很简单。最简单就用文件配置struct。如果要想更方便,用宏来生成这个struct就可以了。
从 ...

你有实用的设计吗?交流一下。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
43 [报告]
发表于 2013-11-18 19:18 |只看该作者
本帖最后由 yulihua49 于 2013-11-18 19:27 编辑
truekbcl 发表于 2013-11-18 09:20
你说的这个,基本上没问题。使用offset的方式处理struct数据,就可以做到了。如果内嵌struct,递归就可以 ...

您举个例子,简单点的。
说明书法,我还能弄,宏。。。。有点费解。

  1. for(i=0;i<number_of(struct);i++) {
  2.        size_of(member_of(struct[i]));
  3.        offset_of(member_of(struct[i]));
  4.        type_of(member_of(struct[i]));
  5.        name_of(member_of(struct[i]));
  6. }
复制代码
需要这些东西,怎么弄?

论坛徽章:
0
44 [报告]
发表于 2013-11-19 08:52 |只看该作者
什么地方会用到反射这个需求,有这个实际需求?做这么多项目还没碰到有这样的需求

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
45 [报告]
发表于 2013-11-19 11:05 |只看该作者
struct meta{
            int type;   // c类型映射
            int len;    // 数据长度
            string name; // 名称
            int offset; // 在struct中的位置
};

比如一个结构:
struct test{ int a; double b; };
元信息:
meta m[] =
{
  {INT_TYPE, sizeof(int), "a",  (char*)&a-(char*)this},    // 这是c++的语法,offset域,需要在初始化时计算出这个位置。当然,手工填写也可以,不过很麻烦。
  {DOUBLE_TYPE, sizeof(double), "b",  (char*)&b-(char*)this}
};

获取数据:
test  t;
int x = *((int*)((char*)(&t) + m[0].offset)));

内部基本就这样了。
然后你用宏来生成这些代码即可。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
46 [报告]
发表于 2013-11-19 11:48 |只看该作者
本帖最后由 yulihua49 于 2013-11-19 12:02 编辑
truekbcl 发表于 2013-11-19 11:05
struct meta{
            int type;   // c类型映射
            int len;    // 数据长度

说明书法,跟我的几乎一样。需要一个meta,说明书,
meta:
  1. typedef struct {
  2.             INT4 type;
  3.             INT4 len; // in byte
  4.             const char *name;
  5.             const char *format;
  6.             INT4 offset;
  7.             int bindtype; //default=0
  8. } T_PkgType;
复制代码
模板生成,根据数据库表名。offset要使用前计算。
  1. $ mkpatt.sh
  2. 输入表名: page

  3. T_PkgType PAGE_tpl[]={
  4.         {CH_CHAR,11,"status",0,-1},
  5.         {CH_INT64,sizeof(INT64),"page_id"},
  6.         {CH_CHAR,101,"page_name"},
  7.         {CH_CHAR,101,"page_info"},
  8.         {CH_DATE,YEAR_TO_SEC_LEN,"get_time",YEAR_TO_SEC},
  9.         {CH_DATE,YEAR_TO_SEC_LEN,"out_time",YEAR_TO_SEC},
  10.         {CH_CHAR,101,"page_start"},
  11.         {CH_CHAR,101,"page_to"},
  12.         {CH_DOUBLE,sizeof(double),"yunshu_money","%10.2lf"},
  13.         {CH_CHAR,101,"fhr_name"},
  14.         {CH_CHAR,101,"fhr_address"},
  15.         {CH_CHAR,19,"fhr_card_id"},
  16.         {CH_CHAR,21,"fhr_telephone"},
  17.         {CH_CHAR,101,"shr_name"},
  18.         {CH_CHAR,101,"shr_address"},
  19.         {CH_CHAR,19,"shr_card_id"},
  20.         {CH_CHAR,21,"shr_telephone"},
  21.         {-1,0,"PAGE","page_id|"}
  22. };

  23. extern T_PkgType PAGE_tpl[];
  24. typedef struct {
  25.         char status[11];
  26.         INT64 page_id;
  27.         char page_name[101];
  28.         char page_info[101];
  29.         char get_time[YEAR_TO_SEC_LEN];
  30.         char out_time[YEAR_TO_SEC_LEN];
  31.         char page_start[101];
  32.         char page_to[101];
  33.         double yunshu_money;
  34.         char fhr_name[101];
  35.         char fhr_address[101];
  36.         char fhr_card_id[19];
  37.         char fhr_telephone[21];
  38.         char shr_name[101];
  39.         char shr_address[101];
  40.         char shr_card_id[19];
  41.         char shr_telephone[21];
  42. } PAGE_stu;
复制代码
这样,就可以用PAGE_stu结构访问数据库的PAGE表了,是不是很麻烦?本来应该反射做的事。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
47 [报告]
发表于 2013-11-19 12:12 |只看该作者
本帖最后由 yulihua49 于 2013-11-19 13:59 编辑
u010402865 发表于 2013-11-19 08:52
什么地方会用到反射这个需求,有这个实际需求?做这么多项目还没碰到有这样的需求

我们来序列化上边的那个表:
如果从数据库已经取到一个记录,在PAGE_stu里,可以序列化成json:

PAGE_stu page;
JSON_OBJECT json=json_object_new_object();
....
struct_to_json(&page,json,PAGE_type);//这个函数就需要反射,没有反射,就自己弄模板,映射,比较麻烦。
这个json,你可以发送到网,也可以写文件。(这只是个例子,多数爱用XML,道理是一样的,通用结构处理)。
结构,直接上网不合适,因为对方不同平台。


论坛徽章:
0
48 [报告]
发表于 2013-11-19 13:08 |只看该作者
回复 47# yulihua49

反射编译到程序里,灵活性没有说明书方便吧,一方面占用内存,另一方面失去灵活性,用说明书可以在外面改改文件就可灵活应变。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
49 [报告]
发表于 2013-11-19 13:53 |只看该作者
本帖最后由 yulihua49 于 2013-11-19 14:03 编辑
u010402865 发表于 2013-11-19 13:08
回复 47# yulihua49

反射编译到程序里,灵活性没有说明书方便吧,一方面占用内存,另一方面失去灵活性, ...

也是。你没看见说明书这个玩意儿很繁琐吗?不过是开发时繁琐,使用还是比较简便的。
编译器不给编译进去,还要费很大力量生成说明书。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
50 [报告]
发表于 2013-11-19 14:38 |只看该作者
yulihua49 发表于 2013-11-19 11:48
说明书法,跟我的几乎一样。需要一个meta,说明书,
meta:模板生成,根据数据库表名。offset要使用前计 ...

所有的语言,都只可能类似,这就是反射的本质了。
从使用来说,c麻烦一些,但是c++就要简单得多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP