在C ++中打印空字符串可观察行为?

时间:2011-08-26 14:35:11

标签: c++ state language-lawyer observable-behavior

在C ++ 03中标准可观察行为(1.9 / 6)包括对库I / O函数的调用。现在我有了这段代码:

printf( "" );

正式调用库I / O函数但没有效果。

是否可以观察到行为?允许编译器消除它吗?

5 个答案:

答案 0 :(得分:5)

如果sync_with_stdiotrue,那肯定是可以观察到的。当这是真的时,printf("")强制与std::cout输出同步,刷新以前缓冲的输出。

答案 1 :(得分:2)

可以观察到

  • 如果输出被重定向并且文件被关闭,截断或以某种方式对输出无效
  • 如果流状态仍然是“坏”

关于sync_with _...的观点也很相关

答案 2 :(得分:1)

我非常怀疑它,因为如果操作系统在线程调用printf阻塞I / O时选择上下文切换,则多线程编程中的行为可能会变得更加明显。

在这种情况下,如果结果取决于线程的交错方式,它肯定会产生影响。

答案 3 :(得分:1)

理论上,您可以使用基于时间刷新缓冲区的方式编写C库。在这种情况下,打印空字符串可以导致刷新,从而产生可见效果。

答案 4 :(得分:-3)

当然这有可观察的行为 - 它必须使用底层文件描述符生成对write()系统调用的调用。进行系统调用是非常明显的行为。

考虑一个极端的例子,内核中的文件描述符可以由设备驱动程序提供服务,每次调用写文件操作时都会发出警报声(好吧,有点人为的例子,我承认:-)。 ..