информационная безопасность без паники и всерьез подробно о проекте |
||||||||||||||||||||||
|
||||||||||||||||||||||
|
29.03.11 14:34 // оригинал При разборе косяков с ClassView в 2010-й студии было сразу понятно, что предпосылки проблемы восходят к тем уже далеким временам, когда один здоровый монолитный проект был разнесен по десятку dll. Первый подход был кривоват, полезли перекрестные ссылки подпроектов, которые через некоторое время пришлось разрулить железной рукой, при этом поперли кросс-ссылки инклюдов, которые разруливались в основном через активное использование forward-описаний классов (что, конечно, подпорки, но гораздо проще и быстрее долгого выстраивания правильного порядка инклюдов - опять же, не всегда достижимого). В сочетании же с пространствами имен простое forward-описание приходится превращать в более громоздкие конструкции. Т.е., если в MyClass1 используется указатель на MyClass2, а живут они в разных пространствах имен, выглядеть это будет так:
Кроме того, в описании классов/функций из dll активно использовался вполне традиционный подход с выносом __declspec(dllexport/dllimport) в макросы, чтоб убрать поддержку двух наборов хедеров:
После чего можно использовать это как
MYDLLIMP определялся только в проекте, где класс нужно было экспортировать, так что в реализации класс оказывался с dllexport, а в пользовательских проектах с dllimport. Именно эти две вещи и сломали ClassView. Крышеснос с непопаданием в место с описанием случился от MYDLLEXP - ну не врубался новый IntelliSense в эти макросы между ключевым словом class и именем класса. Пришлось чуть подправить:
Теперь все стало лучше, __declspec все-таки воспринимался как валидное ключевое слово, а что там внутри него, ClassView, к счастью, не волновало. Ну а дубли в дереве возникли от сочетания forward-описаний с пространствами имен - каждое такое описание добавляло лишнюю строчку в дерево классов. Причем дубль возникал даже при описании дружественного класса из того же пространства имен:
Причина была понятна сразу, на устранение ушло несколько месяцев неспешных поисков (поскольку жить это особо не мешает, лишь тревожит чувство прекрасного). Сначала искал подходящие настройки, потом подходящие прагмы, остановился же в итоге на следующем варианте, за который даже немного стыдно:
Поскольку еще из опыта с __declspec стало понятно, что у ClassView особые отношения с макросами, был применен тот же подход, но уже в мирных целях, и этот грязный хак вполне прокатил - компилятору пофиг, в дереве чисто.
|
авто
венгрия
вырвиглаз
германия
глюки
греция
гуглемап
драйверы
египет
железки
журнализм
империя добра
испания
италия
кино
кипр
клоуны
книги
криворучки
оспорт
португалия
программизм
сайт
софт
стрим
студень
турция
уродцы
фото
франция
цацки
чехия
читалки
android
bq
e51
eeepc
from facebook
hd2
hpc
htc
ipad
iphone
onlime
vista
windows 10
windows 7
windows 8
yota
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|