|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.12.2012, 19:54 | #1 |
Пользователь
Регистрация: 11.12.2012
Сообщений: 29
|
Чисто теоретический вопрос по CString::Format
Вот чего я не понимаю. Может уважаемые коллеги подскажут. Допустим у нас есть такой код:
CString resString, tempString("blabla"); resString.Format("%s",tempString); и он отлично работает. И это странно - вторая строчка должна выглядеть так, если подходить строго: resString.Format("%s",(LPCTSTR)temp String); ведь на стеке реально находится не указатель на нуль терминированную строку, а что-то совершенно случайное! Объясните - что-то туплю и не понимаю. |
11.12.2012, 20:19 | #2 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,759
|
|
11.12.2012, 20:27 | #3 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
Вообще, это должно бы быть ошибкой компилятора (шланг именно так и делает). Но работает, потому как, по всей видимости, поле-указатель на данные идёт первым в списке полей класса, а при передаче аргументом в функцию с переменных числом параметров, объект класса просто запихивается в стек целиком. Другими словами, что-нибудь вроде
Код:
|
11.12.2012, 21:14 | #4 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
xe3
Вот чего я не понимаю. Может уважаемые коллеги подскажут. Допустим у нас есть такой код: CString resString, tempString("blabla"); resString.Format("%s",tempString); и он отлично работает. И это странно - вторая строчка должна выглядеть так, если подходить строго: resString.Format("%s",(LPCTSTR)temp String); Все правильно. И ссылка на msdn вообще не в тему. эллипсису похеру, что у обьекта есть оператор приведения к типу, поэтому printf тупо выгребает из стека адрес обьекта. в качестве демонстрации попробуй запустить такой пример, проанилизируй результаты: Код:
Если покопаться в гоогле, то можно найти статью, вроде от разработчиков ATL, в которой они объясняли трюк с cstring вкраце - мы понимаем, что правильная запись должна быть str.GetString() или (LPCTSTR) str, но вокруг полно быдло-программистов, которые этого даже не подозревают, а помои за падающие программы, как обычно, выливают на MS, поэтому мы сами пытаемся выпрямить им руки и заставить говно-код работать.
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
12.12.2012, 11:39 | #5 |
Пользователь
Регистрация: 11.12.2012
Сообщений: 29
|
to All
Спасибо! По здравому размышлению за ночь все стало понятно. Не надо программировать по вечерам, но когда тогда программировать?! ))) Да, все работает, только потому что в CSimpleStringT только один член данных, совпадающий по типу с ожидаемым printf - private: PXSTR m_pszData; но стоит произвести из CString новый класс и добавить членов-данных - все полетит в тар-тарары... Замучательно! Еще раз всем спасибо! |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Чисто теоретический вопрос | strannick | Microsoft Office Excel | 5 | 17.11.2012 13:19 |
Теоретический вопрос по потокам | -Jack- | Общие вопросы Delphi | 6 | 04.11.2012 11:50 |
Сжатие по Хаффману - теоретический вопрос. | s-andriano | Общие вопросы Delphi | 4 | 06.06.2012 20:27 |
Теоретический вопрос про массивы (С/С++) | Sergey S | Помощь студентам | 0 | 11.01.2012 10:01 |
Теоретический Вопрос о поиске | diliana | Помощь студентам | 16 | 13.06.2009 03:19 |