免费注册 查看新帖 |

Chinaunix

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

[C] 请教:C语言函数的返回值类型能否为结构体? [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
71 [报告]
发表于 2010-01-28 17:22 |只看该作者

回复 #66 w_anthony 的帖子

你看这么理解可行不?

1. 如果功能已经确定, 就是"修改一个已经存在的对象"
那没得说, 肯定是传入该对象的引用或者指针, 而不是返回一个新的值。

比如 replace

2. 如果功能被确定为 "返回一个新对象"
在这种情况下, 将功能改变为"默认创建, 然后修改", 肯定是有损清晰自然的表达。
而且效率也不见得会高。

比如 substr


3. 如果某个需求既可以被设计为1, 又可以被设计为2
这……   就得仔细研究了……
valarray采用的是2 , 而不是1 。 而且是故意这么设计的。 理由我忘了……

[ 本帖最后由 OwnWaterloo 于 2010-1-28 17:24 编辑 ]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
72 [报告]
发表于 2010-01-28 17:54 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
73 [报告]
发表于 2010-01-28 19:23 |只看该作者

回复 #72 pmerofc 的帖子

ident好像没有什么特殊含义, 就是为下面要描述的那个东西起一个名字
根据ident是斜体瞎猜的……

类似的就像:
there is a function f ...
f balabala ...

有一个函数f ...
f 啥啥...

let's store the value to a local variable v ...
v balabala ...
将这个值存放到一个局部变量v中 ...
v 啥啥...



呃…… 那个prior……  再研究研究……


不用客气
将这个问题彻底搞清楚对我也有好处
比如以前只能"大致觉得"某些(面试)题很sb, 但其实又很心虚 —— 万一误会它了呢?
彻底弄明白之后, 就可以肯定它们中的一些就是sb

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
74 [报告]
发表于 2010-01-28 21:53 |只看该作者

回复 #70 OwnWaterloo 的帖子

场外求助失败     无法得知prior 到底指的什么……
根据给出的例子, 可能是指sequence point之前。 但这种推测肯定是不严谨的, 是由结论去推测过程……

期待大牛了……

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
75 [报告]
发表于 2010-01-28 21:54 |只看该作者
原帖由 OwnWaterloo 于 2010-1-28 17:22 发表
你看这么理解可行不?

1. 如果功能已经确定, 就是"修改一个已经存在的对象"
那没得说, 肯定是传入该对象的引用或者指针, 而不是返回一个新的值。

比如 replace

2. 如果功能被确定为 "返回一个新对 ...


差不多,不过对最后你说的保留意见。
另外如果是DLL导出函数,还是要用1方式,毕竟不同的编译器行为不确定,用2的话MinGW的dll给VC调用就可能会出问题。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
76 [报告]
发表于 2010-01-28 22:22 |只看该作者

回复 #75 w_anthony 的帖子

再换一个角度吧……

比如就是string.replace。 既可以提供返回值的, 也可以提供在一个对象上修改的版本。
(不写模板了, 实际上是个模板)

class string {
public:
      string replace( ... );
static void replace( string& s, ... );
};

那么, 想替换, 并且得到一个新的string, 就可以调用返回值的。
想在既有对象上修改的, 就可以调用传入引用的。

这是2种不同的功能。
当需要一个新对象时 —— 而不管某个特定的函数该如何设计了, 而是从用户的需要来说 —— 返回值可能就会比绕弯去使用引用要快。
当需要在原对象上修改时, 那肯定不能设计为返回值。





"另外如果是DLL导出函数,还是要用1方式,毕竟不同的编译器行为不确定,用2的话MinGW的dll给VC调用就可能会出问题。"
这不是"应该返回值时将其改为创建然后修改"的理由。

这是设计的另一个方面了 —— 是否需要隐藏对象的表示。
如果确实需要, 是不可以创建对象的值, 而只能使用引用的。




这么说吧, 前面一个设计, 可以通过一个问题来得到答案 "你需要获得一个新对象吗?"
如果是, 就返回值; 否则就采用参数。

后面一个设计, 也可以通过一个问题来得到答案 "你要限制按值语意使用对象吗?"
如果是, 连直接创建对象都不可以, 只能通过引用或者指针来创建, 使用, 销毁对象。
在这种情况下, 讨论前一个问题就是无意义的了 —— 本来就不存在(或者不可见)对象的值, 只有引用或指针。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
77 [报告]
发表于 2010-01-28 22:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
78 [报告]
发表于 2010-01-28 22:52 |只看该作者

回复 #77 pmerofc 的帖子

琢磨出来后麻烦分享一下哦  先谢谢了

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
79 [报告]
发表于 2010-01-29 08:47 |只看该作者
原帖由 OwnWaterloo 于 2010-1-28 22:22 发表
再换一个角度吧……

比如就是string.replace。 既可以提供返回值的, 也可以提供在一个对象上修改的版本。
(不写模板了, 实际上是个模板)

class string {
public:
      string replace( ... );
s ...


你想太多了,举个例子Windows api的BOOL GetIconInfo(HICON hIcon, ICONINFO* piconinfo),它可不是ICONINFO GetIconInfo(HICON hIcon)。
或许你是担心传进去的是一个类对象,会在函数内部作new或malloc,但却在外部delete或free,而由于内存分配和释放不在同一模块中导致程序挂掉,不过这又是另外的问题。

论坛徽章:
0
80 [报告]
发表于 2010-01-29 15:06 |只看该作者
可以,最好用指针
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP