Visual studio define в настройках

Обновлено: 07.07.2024

Я пытаюсь выяснить, какую версию Boost мой код думает, что он использует. Я хочу сделать что-то вроде этого:

но препроцессор не расширяет BOOST_VERSION.

Я знаю, что могу распечатать его во время выполнения из программы, и я знаю, что могу посмотреть на выход препроцессора, чтобы найти ответ. Я чувствую, что способ сделать это во время компиляции может быть полезен.

на "определяется как interger", "определено как строка" и "определено, но не имеет значения" переменные , они работают просто отлично. Только для "не определен" переменная, они отображаются точно так же, как и исходное имя переменной. Ты должен привык к этому-или, может быть, кто-то может предложить лучшее решение.

Я знаю, что это долгое время после исходного запроса, но это может быть полезно.

значение макроса может отображаться с помощью:

см.: 3.4 Stringification в документации gcc online.

определите тот же макрос снова, и компилятор сам выдаст предупреждение.

из предупреждения вы можете увидеть местоположение предыдущего определения.

vi файл предыдущего определения .

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

MSVC2015: неустранимая ошибка C1083: не удается открыть файл include:':: 106200': нет такого файла или каталога

работает, даже если preprocess to file включено, даже если присутствуют недопустимые токены:

просмотр вывода препроцессора-это самое близкое к ответу, который вы просите.

Я знаю, что вы исключили это (и другие способы), но я не уверен, почему. У вас есть достаточно конкретная проблема для решения, но вы не объяснили, почему любой из "нормальных" методов не работает хорошо для вас.

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

не здорово, если BOOST_VERSION-это строка, как я предполагал, но также могут быть отдельные целые числа, определенные для чисел major, minor и revision.

BOOST_VERSION определяется в версии файла заголовка boost.ТЭЦ.

взгляните также на документацию Boost, касающуюся того, как вы используете макрос:

описывает номер версии boost в Формата XXYYZZ, такие, что: (BOOST_VERSION % 100) - это суб-минор версии ((BOOST_VERSION / 100) % 1000) является минорной версией, и (BOOST_VERSION / 100000) главные версия.


На самом деле обычно это автоматизируется с помощью макросов самой студии ( и вариантов макросов в сети много), но мне приятнее использовать контекстное меню, тем более что создание самого расширения — это дело простое, всю работу сделает VSPackage Builder, нам останется лишь вписать несколько строчек кода в обработчик нажатия элемента меню.


Итак, начнем. Нам потребуется Visual Studio 2010 Pro или старше. Необходимо дополнительно установить Visual Studio 2010 SDK и специальное дополнение VSPackage Builder, максимально облегчающее создание новых расширений.

Создание расширения


В открывшемся проекте разместим на дизайнере расширения (файл HeaderDefineCreater.vspackage) все необходимые нам элементы. Начнем с первого элемента — добавим контекстное меню. В его свойствах напротив поля Location выберем размещение — «Context Menu | Editor»


Затем создадим группу Group, одну кнопку (назовем ее CreateHeaderDefineButton) и два коннекта между всеми элементами. На скрине с левой стороны показаны свойства для кнопки. Там все стандартное, разве что следует обратить внимание что кнопка (то есть строка в контекстном меню) будет видима только в редакторе (Visibility Constraints: TextEditor). Что касается шортката, то эти поля можно оставить пустыми, поскольку их можно настроить отдельно при использовании расширения.


Ну вот, все готово. Осталось только заполнить обработчик нажатия на элемент контекстного меню.
Автоматически сгенерированный обработчик нажатия выглядит следующим образом:

Нам осталось лишь заполнить поля в манифесте (добавить иконку, описание и тд. ) и все скомпилировать.


После компиляции мы получим готовое расширение HeaderDefineCreater.vsix.

Установка расширения и смена шорткатов

Устанавливается расширение простым двойным кликом.
Удалить его можно зайдя в Tools->Extension Manager.


Для того, чтобы установить шорткат для расширения, нужно зайти в Tools -> Options -> Keyboard, найти там по поиску имя кнопки (мы кнопку назвали CreateHeaderDefineButton, но, впрочем, для простоты можно было бы ее назвать и именем расширения). Для найденной кнопки ставим любое свободное сочетание:


И даже работает в пределах заголовка "3rd_party_classes.h", но только не переносится на 3rd_party_classes.cpp до тех пор пока я не объявлю DISABLE_CLASS_A и другие константы в свойствах проекта, что крайне неудобно и вообще легко про них забыть на этих задворках.

Вы писали о свойствах проекта, не обратил внимание, прошу прощения, о них я и говорил. -D флаг компилятора для определения макроса в компилируемых файлах (самый частый, не знаю как в VS2010).

Вы писали о свойствах проекта, не обратил внимание, прошу прощения, о них я и говорил. -D флаг компилятора для определения макроса в компилируемых файлах (самый частый, не знаю как в VS2010).

- Опция компилятора /D, как уже сказал sherzod_ выше (11911499). Только с поправочкой на "All Configurations"
- Либо создать в окне Property Manager новый Property Sheet и в нем указать нужный(-ые) define и добавить в нужные или во все конфигурации
- либо создать файл заголовок и постоянно его включать в код, но теперь уже с проверкой на существования имени (напр.):

Остальное не понял.

Posted via ActualForum NNTP Server 1.5

Вообще говоря, синоним.

Posted via ActualForum NNTP Server 1.5

Вообще говоря, синоним.

немного показалось, что проблема у вас в консерватории. но лень глубже вникать - простите.
чисто по вопросу.
можно. через окружение.
минусы - нужно выставлять это окружение. если у вас есть пред подготовка сборки - то покатит (например какая нить перловка).

в коде: ловите свой дефайн типа

И Вы хотите скомпилировать у себя эти .срр файлы, и вся задача в том, чтобы задать для них эти дефайны (ведь для хедеров их задавать - Вас устраивает), но для других классов Вы их задавать не хотите.

Чтобы тогда не сделать обертки-срр типа такого:

Нельзя какой угодно.

Posted via ActualForum NNTP Server 1.5

Cerebrum
Но тут встает другой вопрос - как указать в VS дополнительный каталог для cpp файлов

> Но тут встает другой вопрос - как указать в VS дополнительный каталог для cpp файлов

> Так же, как и путь для h файлов. Более того, если они в одной папке, и указывать
> ничего не надо.

-I <путь к вашим долбаным заголовкам и исходникам> -I <другой путь к вашим
долбаным заголовкам и исходникам>

Взаимоотношения таковы: my.h определяет класс, который наследуется от стороннего класса, объявленного в их their.h . Сторонний класс в их their.h включает интересующий макрос, который определен в другом заголовке, например "macro.h".

спросил(а) 2013-05-31T22:32:00+04:00 8 лет, 5 месяцев назад

Вам нужно расширить макрос в исходный код, прежде чем его можно будет отладить. Вы можете сделать это вручную или сделать Visual Studio генерировать препроцессорный выход. http://msdn.microsoft.com/en-us/library/8z9z0bx6(v=vs.80).aspx описывает процесс для VS 2005. Затем вам нужно будет создать новый проект "отладки" с замененными источниками. i, созданных препроцессором Visual Studio. Это боль для любого нетривиального проекта, поэтому сначала я попытаюсь сделать это вручную, тем более, что вы определили конкретный макрос, который вызывает исключение, поэтому вы можете попытаться вручную развернуть только этот. Вы также можете использовать эти файлы.i для препроцессора для перекрестной ссылки.
UPD: Если рассматриваемый макрос используется в нескольких местах, вам может понадобиться выяснить, какое местоположение отвечает за исключение. Запустите его в отладчике (я предполагаю, что у вас есть полная информация об отладке, если нет, вам следует) и проверить стек вызовов во время исключения. Разверните только это место.
Будьте осторожны: некоторые проекты в сообществе с открытым исходным кодом известны тем, что используют макросы в качестве инструментов для обфускации кода (я предполагаю, что их коммерческие секреты не обнаруживаются при обратном проектировании), поэтому удачи.

ответил(а) 2013-05-31T22:52:00+04:00 8 лет, 5 месяцев назад

Я столкнулся с той же проблемой, и я удивлен тем, что VS2017 не разрешает макросы во время отладки. Resharper для C/C++ отличен тем, что он может частично или полностью расширять макросы - вы можете развернуть макрос и перетащить его или перестроить и отладить его, а затем вернуть изменение. Я почти уверен, что есть пробная версия, с которой можно играть.

Читайте также: