免费注册 查看新帖 |

Chinaunix

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

[C++] C++的cout就是个杯具 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2010-03-10 17:07 |只看该作者
我不发表意见,反正我从来都是printf,不用cout

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
22 [报告]
发表于 2010-03-10 20:34 |只看该作者
但是printf是线程安全的,cout不是。
luoleicn 发表于 2010-03-10 16:59


线程安全根本就不算是cout的缺陷。

你从哪看到printf是线程安全的?
C(以及C++)标准根本就没有线程概念。

printf线程安全是因为编译器提供的运行库是线程安全的。
同样也可能存在printf不是线程安全的运行库。
当你依赖printf线程安全时, 你必须查看编译器提供的文档, 确定它是否真的是线程安全。

同理, C++运行库也可以做成线程安全的(C++标准并没有说它一定是,也没有说它一定不是)。
全看具体的C++运行库提供者。

而你的观点, 更准确的表述是 “大多数C运行库提供的printf是线程安全的, 大多数C++运行库提供的cout不是”。
这依然不能算是缺点。
不是所有程序都是多线程的, 在那些不是多线程的程序里, 非线程安全的库可以自由使用。
而线程安全的库, 用于同步的额外开销是你很难除去的。

而在多线程环境下, 作为一个对多线程稍有了解的程序员就应该知道被多个线程共享的对象应该考虑其同步。
非线程安全的库, 可以自己同步 —— 如果这都不会, 那就别开发使用多线程的程序了。

总之, 非线程安全的库在稍有不便, 但更灵活,
而因为“大多数cout不是线程安全而产生的悲剧”, 只能怪自己。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
23 [报告]
发表于 2010-03-10 20:48 |只看该作者
printf 是不可重入函数

但好像现在的系统都实现了printf线程安全了

论坛徽章:
0
24 [报告]
发表于 2010-03-10 21:22 |只看该作者
各有所长,取其所长,避其所短。

论坛徽章:
0
25 [报告]
发表于 2010-03-11 08: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
26 [报告]
发表于 2010-03-11 09:10 |只看该作者
本帖最后由 w_anthony 于 2010-03-11 09:13 编辑
线程安全根本就不算是cout的缺陷。

你从哪看到printf是线程安全的?
C(以及C++)标准根本就没有线 ...
OwnWaterloo 发表于 2010-03-10 20:34



感觉cout确实可以实现比printf更多的功能,但是printf可以实现线程安全,cout该怎么实现完全没有头绪,就比如LZ的例子:
  1. cout << "hex = 0x" << setw (8) << setfill ('0') << hex << var << ", dec = " << setw (10) << setfill (' ') << dec << var << endl
复制代码
两条线程同时打印,由于多次调用<<,输出可能会交叉显示,需要怎么设计cout才能实现线程安全?我唯一想到方法就是<<返回一个临时ostream对象而不是引用,然后它的构造里面加递归锁,析构里面解锁,可惜现实代价太大……
似乎这个问题不是线程安全,不过也是一个问题。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
27 [报告]
发表于 2010-03-11 09:50 |只看该作者
楼主能不能告诉我下面使用cout的代码怎么用printf完成?还有这个另外,下面一坨狗屎代码如何写得既优美,又 ...
OwnWaterloo 发表于 2010-03-09 18:13


如果要输出8个'-',那就显式的

  1. printf("--------");
复制代码

直观,一目了然,有什么不好呢?
如果要在程序中多次输出:

  1. #define SPLITTED_LINE "--------"
  2. printf(SPLITTED_LINE);
  3. ...
  4. printf(SPLITTED_LINE);
  5. ...
复制代码


编译器支持C99(gcc 加 -std=c99参数)

  1. size_t v1;
  2. printf("%zu", v1);
  3. ptrdiff_t v2;
  4. printf("%zd", v2)
复制代码

这样就没有32位和64位下的移植问题了。

对于类的输出,在类里public一个description函数,返回string或const char *,比单纯的支持流输出,来的更加通用。

对于

  1. printf("%p %p %p", (void*)&v1, (void*)&v2, (void*)&var);
复制代码

为什么不用

  1. printf("%x %x %x", &v1, &v2, &var);
复制代码

说实话,我以前还不知道有%p的用法。

long用%ld应该很好记吧,出过一次错,就能记住了。

另外,为了吸引眼球,顶楼的一些愤青言语,还请包涵。

论坛徽章:
0
28 [报告]
发表于 2010-03-11 10:59 |只看该作者
回复 1# noword2k

怎么会看不出呢?前面三个都是格式输出的设置,没有一点问题。
就像微积分对没有经过数学训练的人比较难,但是对数学素养好的就很容易。如果不熟悉cout的这几个格式设置,那只能说看程序的人没有很好的c++素养。往俗了说,自己拉不了屎,能怪马桶没有吸力吗?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
29 [报告]
发表于 2010-03-11 11:06 |只看该作者
回复  noword2k

怎么会看不出呢?前面三个都是格式输出的设置,没有一点问题。
就像微积分对没有经过数 ...
apple753357 发表于 2010-03-11 10:59



我说的是“一眼就看出来”。
问题的焦点是,同printf的版本进行比较,哪个更直观,更一目了然,而不是能不能看出来。

论坛徽章:
0
30 [报告]
发表于 2010-03-11 15:29 |只看该作者
如果要输出8个'-',那就显式的

直观,一目了然,有什么不好呢?
如果要在程序中多次输出:


编 ...
noword2k 发表于 2010-03-11 09:50



    有道理,学习.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP