Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2012, 19:54   #1
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 11.12.2012
Сообщений: 29
По умолчанию Чисто теоретический вопрос по CString::Format

Вот чего я не понимаю. Может уважаемые коллеги подскажут. Допустим у нас есть такой код:

CString resString, tempString("blabla");

resString.Format("%s",tempString);

и он отлично работает. И это странно - вторая строчка должна выглядеть так, если подходить строго:

resString.Format("%s",(LPCTSTR)temp String);

ведь на стеке реально находится не указатель на нуль терминированную строку, а что-то совершенно случайное!

Объясните - что-то туплю и не понимаю.
xe3 вне форума Ответить с цитированием
Старый 11.12.2012, 20:19   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx
p51x вне форума Ответить с цитированием
Старый 11.12.2012, 20:27   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вообще, это должно бы быть ошибкой компилятора (шланг именно так и делает). Но работает, потому как, по всей видимости, поле-указатель на данные идёт первым в списке полей класса, а при передаче аргументом в функцию с переменных числом параметров, объект класса просто запихивается в стек целиком. Другими словами, что-нибудь вроде
Код:
resString.Format("%s%d", tempString, 100000);
может выдать не то, что Вы ожидаете (в силу вероятного существования полей хранящих длину строки, ёмкость и так далее).
netrino вне форума Ответить с цитированием
Старый 11.12.2012, 21:14   #4
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

xe3

Вот чего я не понимаю. Может уважаемые коллеги подскажут. Допустим у нас есть такой код:

CString resString, tempString("blabla");

resString.Format("%s",tempString);

и он отлично работает. И это странно - вторая строчка должна выглядеть так, если подходить строго:

resString.Format("%s",(LPCTSTR)temp String);


Все правильно.
И ссылка на msdn вообще не в тему.
эллипсису похеру, что у обьекта есть оператор приведения к типу, поэтому printf тупо выгребает из стека адрес обьекта.

в качестве демонстрации попробуй запустить такой пример, проанилизируй результаты:

Код:
class string
{
public:
	string(const char* s) : s_(_strdup(s)), length_(strlen(s))
	{ }

	~string()
	{ free(s_); }

	size_t size() const
	{ return length_; }

	operator const char* () const
	{ return s_; }

protected:
	size_t length_;
	char* s_;

private:
	string(const string&);
	string& operator=(const string&);
};

void print1(const char* p)
{
	printf("operator char*: %s\n", p);
}

void print2(const string& obj)
{
	printf("size: %u, object: %s\n", obj.size(), obj);
}

int main()
{
	string s("Hello");
	print1(s);
	print2(s);

	return 0;
}

Если покопаться в гоогле, то можно найти статью, вроде от разработчиков ATL, в которой они объясняли трюк с cstring

вкраце - мы понимаем, что правильная запись должна быть str.GetString() или (LPCTSTR) str, но вокруг полно быдло-программистов, которые этого даже не подозревают, а помои за падающие программы, как обычно, выливают на MS, поэтому мы сами пытаемся выпрямить им руки и заставить говно-код работать.
Rififi вне форума Ответить с цитированием
Старый 12.12.2012, 11:39   #5
xe3
Пользователь
 
Аватар для xe3
 
Регистрация: 11.12.2012
Сообщений: 29
По умолчанию

to All

Спасибо! По здравому размышлению за ночь все стало понятно. Не надо программировать по вечерам, но когда тогда программировать?! )))

Да, все работает, только потому что в CSimpleStringT только один член данных, совпадающий по типу с ожидаемым printf -

private:
PXSTR m_pszData;


но стоит произвести из CString новый класс и добавить членов-данных - все полетит в тар-тарары... Замучательно!

Еще раз всем спасибо!
xe3 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чисто теоретический вопрос 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