ATL::CA2WEX<> str("test");
printf("%S %08X", str, str);
вывод: test 00650074
стэк перед вызовом printf такой:
0012FBAC 00408148 ASCII "%S %08X" первый аргумент
0012FBB0 0012FDC4 UNICODE "test" второй аргумент
0012FBB4 00650074 третий аргумент
почему второй и третий аргументы в стеке у printf отличаются? ведь компилятор не может в compile time определить типы аргументов printf
CA2WEX это простенький ATL класс для хранения и конвертации строк, сорс здесь C:\program files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlconv.h
G>почему второй и третий аргументы в стеке у printf отличаются? ведь компилятор не может в compile time определить типы аргументов printf
Потому что в стек кладётся не указатель на Unicode строку а инстанс класса CA2WEX. То что его member со смещением 0 указывает на Unicode строку — счастливая случайность. Для того чтобы использовать этот класс в printf надо явно приводить типы к LPCWSTR, а ещё лучше — вообще не использовать printf равно как и все другие функции с переменным числом аргументов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
L>Потому что в стек кладётся не указатель на Unicode строку а инстанс класса CA2WEX. То что его member со смещением 0 указывает на Unicode строку — счастливая случайность. Для того чтобы использовать этот класс в printf надо явно приводить типы к LPCWSTR, а ещё лучше — вообще не использовать printf равно как и все другие функции с переменным числом аргументов.
спасибо! наконец-то догнал