单个C代码中的printf和wprintf

在代码中一起使用printfwprintf函数时遇到问题。 如果首先打印常规字符串,则wprintf不起作用。 如果我先使用wprintf那么printf不起作用。

 #include  #include  #include  #include  int main() { setlocale(LC_ALL,""); printf("No printing!\n"); wprintf(L"Printing!\n"); wprintf(L"Wide char\n"); printf("ASCII\n"); return 0; } 

输出:

 No printing! ASCII 

 #include  #include  #include  #include  int main() { setlocale(LC_ALL,""); wprintf(L"Printing!\n"); printf("No printing!\n"); wprintf(L"Wide char\n"); printf("ASCII\n"); return 0; } 

输出:

 Printing! Wide char 

我在64位Linux 3.0上使用gcc(GCC)4.6.1 20110819和glibc 2.14。

这是可以预料的; 您的代码正在调用未定义的行为。 根据C标准,每个FILE流都与它相关联的“方向”(“字节”或“宽”),它由对其执行的第一个操作设置,并且可以使用fwide函数进行检查。调用其任何函数,方向与流的方向冲突导致未定义的行为。

为了补充R ..的接受答案:

虽然很少这样做,但检查printf / wprintf的返回代码会更清楚地表明其中一个不起作用(对于打印function,它应该返回-1,根据流的当前方向,它是无效的)。

不幸的是,检查标准库函数中的错误的常见模式:

 if (wprintf(...) == -1) { perror("wprintf"); ... } 

在这里可能没有多大帮助:如果将流设置为输出非宽字符,并且您调用wprintf ,则可能未设置errno ,您将获得wprintf: Success ,它不提供太多信息。

因此,当您不了解流的字符方向时,这确实是一个有点难以理解的问题。