免费注册 查看新帖 |

Chinaunix

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

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

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

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

回复 #61 pmerofc 的帖子

经常看到类似这样的代码: (可能写错了 大致就这么个意思   )
int f(a, b)
      int a,
      int b
{
      ...
}
怎么说呢, 当历史车轮前进的同时, 总是有守旧派的

说到自然的表达思想,有句话但不记得出处了: 代码是给人看的, 只是顺便让机器执行

论坛徽章:
0
63 [报告]
发表于 2010-01-28 01:51 |只看该作者
原帖由 OwnWaterloo 于 2010-1-28 01:36 发表
经常看到类似这样的代码: (可能写错了 大致就这么个意思   )
int f(a, b)
      int a,
      int b
{
      ...
}
怎么说呢, 当历史车轮前进的同时, 总是有守旧派的

说到 ...


也许不是守旧,而是为了能让古老的编译器也能编译通过这代码?

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

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

论坛徽章:
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
66 [报告]
发表于 2010-01-28 10:34 |只看该作者
原帖由 OwnWaterloo 于 2010-1-28 00:55 发表

嘿嘿, 换VC8吧~

看这个:
http://msdn.microsoft.com/en-us/library/ms364057(VS.80).aspx

Named Return Value Optimization in Visual C++ 2005

Summary: Shows how the Visual C++ compiler eli ...


都能这么优化了,那也没啥好诟病的了,直接返回大结构的唯一软肋现在就剩一个了:
A func(int param);
A a = func(0);
doSomething(&a);
a = func(1);           //软肋
doSomething(&a);

虽然可以再分配一个A,不过有时候也存在就需要往指定内存填数据的情况。

[ 本帖最后由 w_anthony 于 2010-1-28 10:35 编辑 ]

论坛徽章:
0
67 [报告]
发表于 2010-01-28 10:38 |只看该作者
学习下

论坛徽章:
0
68 [报告]
发表于 2010-01-28 15:13 |只看该作者
ABI

论坛徽章:
0
69 [报告]
发表于 2010-01-28 16:03 |只看该作者
原帖由 daviescai 于 2010-1-28 15:13 发表
ABI


是的. 可能就是二进制兼容的需要导致了gcc在windows和linux上不同的编译结果 .

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

回复 #64 pmerofc 的帖子

我也不是经常去翻标准的……  做编译器的人才是标准专家
只是有时候希望代码的行为能够有某种保证时, 才去翻翻看有没有这种保证。
比如最近翻到3个比较受用的保证:
1. struct 中可以有padding, 但绝对不会出现在第1个field之前。
2. union中所有field的offset都是0 。
3. ==, !=, < ... 这些操作符的结果都是0或者1 。


我英文也很烂……   6级都没过……
那段话是出自这里吧?

c99 6.5 Expressions p67
2 Between the previous and next sequence point an object shall have its stored value
modified at most once by the evaluation of an expression. Furthermore, the prior value
shall be read only to determine the value to be stored.70)

...

70) This paragraph renders undefined statement expressions such as
i = ++i + 1;
a[i++] = i;
while allowing
i = i + 1;
a[i ] = i;


没看懂……  
我还搜了一些其他资料, 比如这个: http://www.embedded.com/story/OEG20020625S0041

依然没看懂……  觉得有些歧义。 也许是我理解错了……



但是在附录中翻到一个对应的条款, 好像更容易理解一些:
c99 J.2 Undefined behavior p491
— Between two sequence points, an object is modified more than once, or is modified
and the prior value is read other than to determine the value to be stored (6.5).


那个prior真的很关键……  指的是:
1. modify之前
2. sequence point之前

如果是2, 那基本就说得通了。 如果是1……  还是不懂……
然后就困了睡了……


出门寻求场外援助去了
晚上回来看能不能将这这个词理解准确一些……



ident是什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP