Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) declspec(__dllimport) и операция взятия адреса (число прочтений - 13749 )
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: declspec(__dllimport) и операция взятия адреса
Ответ #15 - 18. Мая 2008 :: 15:12
Печать  
+
Может, это и не много, но все - по делу.

А вот - что больше всего порадовало.
Берешь icpp, там есть шаблончик

Код
Выбрать все
class CSimpleCollection : public CSimpleContext, public COLLTYPE
 



меняешь порядок наследования:

Код
Выбрать все
class CSimpleCollection : public COLLTYPE, public CSimpleContext
 



И получаешь моментальный вылет в космос при использовании методов коллекции.
На эту тему есть запись: http://www.1cpp.ru/bugs/show_bug.cgi?id=3840

Как ты думаешь, я много времени потратил на поиск решения?
10 минут.
Потому что знал, где искать.
Теперь представь, что ты берешь этот код и пытаешься разобраться.
Хватит 10 минут?
Мне в чужом коде - точно нет.

Беда в том, что Intel не диагностирует данный тип проблемы.
Intel допускает ОЧЕНЬ вольное обращение с указателями на функции-члены.
А указатель на функцию-член - это очень хитрый тип данных, которому такое обращение совсем не подобает.

К примеру, в оригинале указатель из типа CSimpleCollection::* преобразуется в CBLContext::* вообще полностью неявно:
Код
Выбрать все
pDef->AddFunc("Count", "Количество", 0, funcCount);
 


И ничего - ни малейшего сомнения у ICL.

VS9 требует же явного приведения типа (да-да, я знаю, что делаю)
Код
Выбрать все
pDef->AddFunc("Count", "Количество", 0, static_cast<CSimpleDef::PF_Func>(&CSimpleCollection::funcCount));
 



И при изменении порядка базовых классов дает максимально точное определение этого безобразия:
Код
Выбрать все
warning C4407: cast between different pointer to member representations, compiler may generate incorrect code
 


100% верно.

При том, что и VS9, и ICL делают одно и то же, "they generate incorrect code" Улыбка
Только ICL это делает молча.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: declspec(__dllimport) и операция взятия адреса
Ответ #16 - 18. Мая 2008 :: 19:29
Печать  
kms писал(а) 18. Мая 2008 :: 14:54:
Код
Выбрать все
GlobalMethods.h	warning C4996: 'swprintf': swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.
 


наконец-то получил вменяемое сообщение

Ха! Да за использование функций семейства *printf* нужно вообще сразу давать по ... рукам. Смысла в их использовании, как правило, 0.

kms писал(а) 18. Мая 2008 :: 14:54:
Код
Выбрать все
Preprocessor.h: std::auto_ptr<CRangesOfDescrImpl> m_pImpl;
warning C4150: deletion of pointer to incomplete type 'CRangesOfDescrImpl'; no destructor called
 


Что там удаляет auto_ptr под ICL - не известно

Правильные указатели юзать надо. Область применения auto_ptr невероятно мала. Мне он понадобился один или два раза. Использовать надо boost::scoped_ptr и ваши волосы (если еще остались после доделывания 1С++) будут сами знаете какими. В scoped_ptr диагностика неполных типов встроена в сам класс + scoped_ptr более безопасен и более ошибкоустойчив.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: declspec(__dllimport) и операция взятия адреса
Ответ #17 - 18. Мая 2008 :: 19:36
Печать  
kms писал(а) 18. Мая 2008 :: 15:12:
Берешь icpp, там есть шаблончик

Код
Выбрать все
class CSimpleCollection : public CSimpleContext, public COLLTYPE
 


То, что в C++ все очень сложно с указателями на функции-члены, особенно в случае множественного и/или виртуального наследования, это, в общем-то, известно. И тот, кто, несмотря на это, их использует играет с огнем и ходит по минному полю. Если бы проект 1С++ был коммерческим, то PM бы для начала тихо и по доброму просто попросил бы изменить дизайн к чертовой бабушке. Если автор кода проигнорировал бы это пожелание, то его просто попросили бы пойти вон. Потому что сейчас ты смог понять, в чем проблема и нашел способ исправления. А если кто-то кроме тебя поправит этот код? И опять всплывут эти грабли? Опять траходром и безудержная отладка, ведущая к срыву сроков выпуска продукта? Кому это надо? Короче, дизайн менять надо. И не использовать такое в будущем.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: declspec(__dllimport) и операция взятия адреса
Ответ #18 - 18. Мая 2008 :: 19:39
Печать  
А в общем, понятно, что компиляция разными компиляторами - крайне полезная вещь.  Очень довольный
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: declspec(__dllimport) и операция взятия адреса
Ответ #19 - 18. Мая 2008 :: 22:46
Печать  
Uzhast писал(а) 18. Мая 2008 :: 19:39:
А в общем, понятно, что компиляция разными компиляторами - крайне полезная вещь.  Очень довольный

Отож. Очень довольный
Особенно если проникнуться идеями TDD, то разный стремный код очень быстро выходит из сумрака.

Ну, насчет дизайна - да ну ладно тебе, слегонца ты погорячился, для С++ там вполне нормальный дизайн.
С любым дизайном будет плохо, когда "мал настолько знаний груз, что не смог попасть и в вуз". Улыбка
Эта проблема с указателями на члены намного более очевидная и простая, чем то же взятие адреса импортируемой функции или поведение CString::CompareNoCase под rational, или фигня с WINVER/stlport.

Но, короче, речь не об этом.

Вот, зарядил тут http://www.1cpp.ru/bugs/show_bug.cgi?id=3848
Компилируется сейчас и под ICL (по прежнему), и под VS.
Только пути требуются различные.

Как быстро менять пути - не знаю.
Казалось бы, что может быть проще - зарегистрировать новую платформу - и все дела.
Но как это сделать - х.з.

Пока под 2005 оставил ICL, под 2008 - нативное для VS9 окружение + boost.
Забавно, что под 2008 даже можно собирать и конфигурации для ICL - уже с CRT8/9. Улыбка

P.S.
Да, и как я вижу, свершилось чудо - и MS взялась за реализацию TR1.
http://www.microsoft.com/downloads/details.aspx?familyid=D466226B-8DAB-445F-A7B4...
  

De quelle planète es-tu?
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: declspec(__dllimport) и операция взятия адреса
Ответ #20 - 19. Мая 2008 :: 06:23
Печать  
так, глядишь, дойдем и до того, чтобы gcc использовать Улыбка
  
Наверх
www  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: declspec(__dllimport) и операция взятия адреса
Ответ #21 - 19. Мая 2008 :: 06:39
Печать  
kms писал(а) 18. Мая 2008 :: 22:46:
Вот, зарядил тут http://www.1cpp.ru/bugs/show_bug.cgi?id=3848

Сдается мне, что вместо переколупывания всех описаний контекстов и вставляний туда амперсендов можно было всего лишь поправить в одном месте макросы BL_METH_PROC и иже с ним  Смех

kms писал(а) 18. Мая 2008 :: 22:46:
Как быстро менять пути - не знаю.


C:\Documents and Settings\%ЮзверьНейм%\Local Settings\Application Data\Microsoft\VisualStudio\8.0\VCComponents.dat
Вроде бы. Не проверял.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: declspec(__dllimport) и операция взятия адреса
Ответ #22 - 19. Мая 2008 :: 06:58
Печать  
kms писал(а) 18. Мая 2008 :: 22:46:
Как быстро менять пути - не знаю.
Казалось бы, что может быть проще - зарегистрировать новую платформу - и все дела.
Но как это сделать - х.з.

VS SDK для запуска студии с экспериментальными настройками использует ключ /rootSuffix и утилиту VsRegEx.exe. Не оно?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: declspec(__dllimport) и операция взятия адреса
Ответ #23 - 19. Мая 2008 :: 07:56
Печать  
berezdetsky писал(а) 19. Мая 2008 :: 06:58:
VS SDK для запуска студии с экспериментальными настройками использует ключ /rootSuffix и утилиту VsRegEx.exe. Не оно?

По виду это то, что нужно http://msdn.microsoft.com/en-us/library/bb166560(VS.80).aspx
Спасибо! Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: declspec(__dllimport) и операция взятия адреса
Ответ #24 - 19. Мая 2008 :: 08:09
Печать  
Uzhast писал(а) 19. Мая 2008 :: 06:39:
Сдается мне, что вместо переколупывания всех описаний контекстов и вставляний туда амперсендов можно было всего лишь поправить в одном месте макросы BL_METH_PROC и иже с ним  Смех

Ага, и все также продолжат втыкать адреса и во всех остальных местах без &.
А кто-то рыжий, кому больше всех надо, чтобы собиралось и под VS, будет постоянно это править.
Да ну, может хоть так запомнится.

Цитата:
C:\Documents and Settings\%ЮзверьНейм%\Local Settings\Application Data\Microsoft\VisualStudio\8.0\VCComponents.dat
Вроде бы. Не проверял.

А не вот это?
"C:\Documents and Settings\%ЮзверьНейм%\My Documents\Visual Studio 2005\Settings\CurrentSettings.vssettings"

Задумался - вроде бы SDK не делает копии этого каталога.
Если не получится использовать SDK, можно попробовать менять настройки в CurrentSettings.vssettings.

В идеале, конечно, найти или написать бы какой-нибудь плугинчик к VS, чтобы можно было менять на лету.
Но, боюсь, все равно ничего не выйдет - даже VAssistX требует перезагрузки при перестройке символьной базы.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: declspec(__dllimport) и операция взятия адреса
Ответ #25 - 19. Мая 2008 :: 08:50
Печать  
kms писал(а) 19. Мая 2008 :: 08:09:
Ага, и все также продолжат втыкать адреса и во всех остальных местах без &.
А кто-то рыжий, кому больше всех надо, чтобы собиралось и под VS, будет постоянно это править.
Да ну, может хоть так запомнится.

"имя метода" в этом параметре не обязательно означает взятие адреса. То, что там берется адрес - это деталь реализации. Не обязательно все должно реализовываться через адрес. Например, имя метода можно использовать для генерации имен каких-нибудь фанк-методов. По сути, ты нарушил своего рода "инкапсуляцию" этих макросов, да и описание контекстов стало менее удобным. Ну да ладно, все равно CMyContext не лучшее решение для контекстов, поэтому пофиг на это.

kms писал(а) 19. Мая 2008 :: 08:09:
А не вот это?
"C:\Documents and Settings\%ЮзверьНейм%\My Documents\Visual Studio 2005\Settings\CurrentSettings.vssettings"

Может быть, не проверял.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: declspec(__dllimport) и операция взятия адреса
Ответ #26 - 19. Мая 2008 :: 09:29
Печать  
Uzhast писал(а) 19. Мая 2008 :: 08:50:
"имя метода" в этом параметре не обязательно означает взятие адреса. То, что там берется адрес - это деталь реализации. Не обязательно все должно реализовываться через адрес. Например, имя метода можно использовать для генерации имен каких-нибудь фанк-методов. По сути, ты нарушил своего рода "инкапсуляцию" этих макросов, да и описание контекстов стало менее удобным. Ну да ладно, все равно CMyContext не лучшее решение для контекстов, поэтому пофиг на это.

Почему я так сделал - я пояснил.
Напишешь другой макрос - тогда и можно будет вернуться к этой теме.

P.S.
Из всех тем, связанных с совместимостью компиляторов, эта мне наименее интересна.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: declspec(__dllimport) и операция взятия адреса
Ответ #27 - 19. Мая 2008 :: 09:41
Печать  
Uzhast

Лучше не парь мне мОзги, а прорекламируй еще раз свою реализацию контекстов.
Где последний вариант в виде примера для чайников посмотреть можно?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: declspec(__dllimport) и операция взятия адреса
Ответ #28 - 19. Мая 2008 :: 21:31
Печать  
Uzhast писал(а) 18. Мая 2008 :: 05:43:
И основные тормоза у меня при линковке. Иногда дебаггерная сборка после модификации всего одного cpp-файла происходит больше минуты. На этом фоне твой релизный ребилд за минуту - полная фигня. Улыбка И зачем тебе такой гемор ради выигрыша всего в 10-20 секунд на полный ребилд?... Блин, если бы я тебе сказал, сколько у меня все тестовые dll собираются в релизе, тебя бы точно кондрат хватил от таких чисел  Подмигивание

Долго.

Конечно, хозяин барин, но есть возможность собирать быстрее.
У меня icpp собирается

debug за 9
release / Ox / Ob2 / Ot - за 14
release / LTCG - за 21

Проблему с LTCG порешал (кстати, было весьма занимательно).

Навязывать не стану, смысла нет; второй миграции среды разработки мне и самому не перенести.
В принципе, мне достаточно понимания того факта, что icpp сейчас написан на вполне стандартном языке.
Это весьма радует.

Думаю, что уже не так много осталось задач, которые хотелось бы сделать в рамках icpp.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: declspec(__dllimport) и операция взятия адреса
Ответ #29 - 20. Мая 2008 :: 06:13
Печать  
Есть вопросы:
1. По прежнему юзаем 2005 + ICL ? или политика партии изменилась?
2. проблему LTGC можно подробнее? Как-то я пропустил тему? Что, как и зачем? Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать