почему отличаются аргументы у printf?
От: greenloki  
Дата: 03.05.06 15:53
Оценка:
    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
Re: почему отличаются аргументы у printf?
От: Left2 Украина  
Дата: 03.05.06 16:18
Оценка: 4 (2)
G>почему второй и третий аргументы в стеке у printf отличаются? ведь компилятор не может в compile time определить типы аргументов printf

Потому что в стек кладётся не указатель на Unicode строку а инстанс класса CA2WEX. То что его member со смещением 0 указывает на Unicode строку — счастливая случайность. Для того чтобы использовать этот класс в printf надо явно приводить типы к LPCWSTR, а ещё лучше — вообще не использовать printf равно как и все другие функции с переменным числом аргументов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: почему отличаются аргументы у printf?
От: greenloki  
Дата: 04.05.06 00:18
Оценка:
L>Потому что в стек кладётся не указатель на Unicode строку а инстанс класса CA2WEX. То что его member со смещением 0 указывает на Unicode строку — счастливая случайность. Для того чтобы использовать этот класс в printf надо явно приводить типы к LPCWSTR, а ещё лучше — вообще не использовать printf равно как и все другие функции с переменным числом аргументов.

спасибо! наконец-то догнал
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.