printf暂时还不可替代!
STL的目标之一就是用cout/cin代替printf/scanf。
用scanf输入确实不好,现在估计也没什么人在新的项目里面使用。
而printf虽然有很多缺点,但很多时候是无法替代的。
printf是一个参数个数可变的函数,无法做到类型安全,也无法扩充以支持更多的数据类型。这些是它的主要缺点。
但是它有两个优点,是其STL竞争对手无法做到的。
第一条是表示与代码分离。在printf中,格式字符串是相对独立的,你可以保存一个格式字符串,然后在多种场合下使用。也可以将格式字符串作为参数传递,以便同一个函数可以用不同的格式显示相同的数据。这点,cout无法做到。使用cout的时候,输出格式的表示跟代码紧密地耦合在一起,使用printf时我们得到的灵活性就这样失去了。
第二条是操作的原子性。只要printf函数的内部实现是线程安全的(这点可以轻易做到,只要printf先将输出字符串构造好才一次性输出),我们就可以保证printf操作的原子性(即,一个线程的输出不会被别的线程打断)。使用cout时,由于
cout<<"Hello I am "<<ThreadName<<endl;
这样最简单的输出都要被编译器理解成多个函数调用,而cout又是一个全局对象,这样就很容易被打断而出现类似于这样的输出:
Hello I am Hello I am Thread1 Thread2
鉴于此,我认为cout代替不了printf。
据说boost有Format对象,可能对此问题有帮助,那位朋友对此有了解,请赐教!