2011-12-30 16 views
18

Tengo un problema al usar las funciones printf y wprintf juntas en el código. Si la cadena normal se imprime primero, entonces wprintf no funciona. Si utilizo primero wprintf, entonces printf no funciona.printf y wprintf en código C simple

#include <stdio.h> 
#include <wchar.h> 
#include <stdlib.h> 
#include <locale.h> 

int main() 
{ 
    setlocale(LC_ALL,""); 

    printf("No printing!\n"); 
    wprintf(L"Printing!\n"); 
    wprintf(L"Wide char\n"); 
    printf("ASCII\n"); 
    return 0; 
} 

Salidas:

No printing! 
ASCII 

Mientras que

#include <stdio.h> 
#include <wchar.h> 
#include <stdlib.h> 
#include <locale.h> 

int main() 
{ 
    setlocale(LC_ALL,""); 

    wprintf(L"Printing!\n"); 
    printf("No printing!\n"); 
    wprintf(L"Wide char\n"); 
    printf("ASCII\n"); 
    return 0; 
} 

salidas:

Printing! 
Wide char 

estoy usando gcc (GCC) 4.6.1 20110819 junto con glibc 2.14 en 64bit Linux 3.0.

+0

Linux 3.0? ¿Que es eso? ¿Qué distribución? – bmargulies

+0

@bmargulies: versión Kernel. La distribución es Archlinux. –

Respuesta

14

Esto es de esperar; su código está invocando un comportamiento indefinido. Según el estándar C, cada flujo FILE tiene asociada una "orientación" (ya sea "byte" o "ancho") que se establece mediante la primera operación realizada en él, y que se puede inspeccionar con la función fwide. Llamar a cualquier función cuya respuesta conflictos de orientación con la orientación de los resultados de arroyos en un comportamiento indefinido

+0

¿Hay un comportamiento indefinido o simplemente no se genera nada si la orientación no coincide con los datos que se escribirán? – alk

+0

Basado en esto: http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Streams-and-I18N.html, el comportamiento no está definido. – DRH

+2

@alk Comportamiento no definido significa que no hay expectativas de cómo debería comportarse en esta circunstancia. Por lo tanto, no es aceptable generar nada, ya que se convierte silenciosamente el texto a la orientación adecuada o se imprime basura. –

2

Para l .. 's aceptadas:.

Si bien esto es muy rara vez se hace, comprobando el código de retorno de printf/wprintf indicaría más claramente que uno de ellos no está funcionando (debe devolver -1 para la función de impresión que no es válida de acuerdo con la orientación actual del flujo).

Por desgracia, un patrón común para el control de errores en las funciones de la biblioteca estándar:

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

no ayude mucho aquí: si la corriente se establece en salida caracteres que no son de ancho, y se llama wprintf, errno no puede haber establecer y obtendrá wprintf: Success, que no proporciona mucha información.

De hecho, este es un problema algo difícil de entender cuando no se conoce la orientación del carácter de las transmisiones.

+0

Verificar el valor de retorno ayuda cuando tiene un error reportable, no cuando tiene un comportamiento indefinido. 'wprintf' no está especificado para fallar cuando la orientación es incorrecta. Por el contrario, lo que hace cuando la orientación es incorrecta es * no especificado en absoluto *. Eso es lo que significa indefinido. –