Я пробовал следующий код:
wprintf(L"1 %s\n","some string"); //Good
wprintf(L"2 %s\n",L"some string"); //Not good -> print only first character of the string
printf("3 %s\n","some string"); //Good
//printf("4 %s\n",L"some string"); //Doesn't compile
printf("\n");
wprintf(L"1 %S\n","some string"); //Not good -> print some funny stuff
wprintf(L"2 %S\n",L"some string"); //Good
//printf("3 %S\n","some string"); //Doesn't compile
printf("4 %S\n",L"some string"); //Good
И я получаю следующий вывод:
1 some string
2 s
3 some string
1 g1 %s
2 some string
4 some string
Итак: кажется, что как wprintf
, так и printf
могут корректно печатать как char *, так и wchar *, но только если используется точный спецификатор. Если используется неверный спецификатор, вы можете не получить компиляционную ошибку (или предупреждение!) и в конечном итоге ошибиться. Вы испытываете то же поведение?
Примечание. Это было протестировано под Windows, скомпилировано с MinGW и g++ 4.7.2 (я проверю gcc позже)
Изменить: я также пробовал% ls (результат в комментариях)
printf("\n");
wprintf(L"1 %ls\n","some string"); //Not good -> print funny stuff
wprintf(L"2 %ls\n",L"some string"); //Good
// printf("3 %ls\n","some string"); //Doesn't compile
printf("4 %ls\n",L"some string"); //Good