GNU C 手册说:
能够将相同的流用于宽操作和普通操作有一个限制:一个流可以用于宽操作或普通操作。
[...]
重要的是永远不要在流上混合使用宽和非宽操作。没有发出诊断信息。应用程序的行为会很奇怪,或者应用程序会崩溃。该
fwide
功能可以帮助避免这种情况。
我在 vs2012 上试过, aprintf
紧接着是 a wprintf
,这个简单的程序可以正常工作。
那么我的问题是,手册是什么意思?何时以及为什么我们应该使用fwide
函数?
该手册更完整地说:
能够将相同的流用于宽操作和普通操作有一个限制:一个流可以用于宽操作或普通操作。一旦决定了,就没有回头路了。只有调用 freopen 或 freopen64 才能重置方向。方向可以通过三种方式确定:
- 如果使用任何普通字符函数(这包括 fread 和 fwrite 函数),则流被标记为不是面向宽的。
- 如果使用任何宽字符函数,则流被标记为面向宽的。
- fwide 函数可用于以任一方式设置方向。
重要的是永远不要在流上混合使用宽和非宽操作。没有发出诊断信息。应用程序的行为会很奇怪,或者应用程序会崩溃。fwide 函数可以帮助避免这种情况。
请注意,Microsoft 文档说它们fwide()
“未实现”(它是无操作的)并且它“不符合标准”。
我对这一切的理解是,使用 glibc 的程序不能在不重新打开它的情况下在单个流上同时使用窄字符和宽字符函数。也许在微软平台上没有这样的限制;也许甚至其他 libc 实现更灵活。