2013-02-15 2 views
8

Visual Studio имеет макросы, такие как $(TargetDirectory), $(OutputPath) и т. Д.
В моем исходном коде я хочу указать относительный путь для загрузки файла из папки на несколько уровней ниже TargetDirectory.
В настоящее время я делаю это: mLayer = mEngine->AddLayer("D:\\Projects\\abc.osg");, и я хочу, чтобы это было что-то вроде mLayer = mEngine->AddLayer(($TargetDirectory)+"..\\..\\abc.osg");Доступ к макросам Visual Studio из исходного кода?

Это просто временное требование, так что я могу дать код на человека за небольшую демо, и его Целевой_каталог это по-разному выровненным по моим каталогам. Есть ли способ использовать макросы Visual Studio в исходном коде? (по крайней мере, я знаю, что переменные среды системы могут быть доступны)

ответ

7

Перейти к Project Properties -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions и добавьте следующее:

TARGET_DIRECTORY=LR"($(TargetDir))" 

Это определяет широкий строкового литерала с именем целевой_каталог, который содержит содержимое поля $ (TargetDir). Важно то, что это создает необработанную строку C++, которая не обрабатывает обратную косую черту как escape-символы. Пути содержат обратную косую черту. Использование регулярного строкового литерала было бы неверным и даже приводило бы к ошибкам компилятора в некоторых случаях.

Важно!

Если вы используете макрос, который может содержать закрывающую скобку следуют двойные кавычки)»необходимо использовать дополнительный ограничитель, который не может происходить в макро-значения, например:

TARGET_DIRECTORY=LR"|($(TargetDir))|" 

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

+0

Нет. Не работает. Я попытался отключить TARGET_DIRECTORY и получил эти ошибки. Ошибка C2065:« LR »: необъявленный идентификатор', 'ошибка C2143: синтаксическая ошибка: отсутствует ';' перед 'string'', 'ошибка C2563: несоответствие в списке формальных параметров' – Nav

+0

Хорошо, кажется, что строки с сыром были введены с C++ 11 и недоступны в VS 2010. Извините, он работает с VS 2013. – Tom

-1

Не знаю, что я знаю, но у меня есть альтернатива.

Разверните свой файл как шаг пост-сборки. На этом шаге вы можете использовать макрос $ (OutDir), который представляет папку для выпадающих списков. Это поможет вам разместить этот файл в относительном положении от вашего приложения и использовать эту относительную позицию в вашем коде.

Это будет долговременное решение, а не временное решение.

7

Вы не можете сделать это автоматически, но вы можете передать конкретные MSBuild свойства препроцессора:

<ItemDefinitionGroup> 
    <ClCompile> 
    <PreprocessorDefinitions>TARGET_DIRECTORY="$(TargetDirectory)"</PreprocessorDefinitions> 
    </ClCompile> 
</ItemDefinitionGroup> 

Это может быть сконфигурирован в IDE, перейдя в диалоговое окно Project Property Pages, перейдя по ссылке Свойства конфигурации -> C/C++ -> Preprocessor Определения и добавление

TARGET_DIRECTORY="$(TargetDirectory)" 

Обратите внимание, что использование + для струнного буквального конкатенации неверна: строковых литералов (и C струны в целом) не могут быть объединены при помощи +. Скорее, строковые литералы можно объединить, просто поставив их рядом друг с другом. Например,

TARGET_DIRECTORY "..\\..\\abc.osg" 
+0

Я не могу использовать макрос в коде. Компилятор говорит, что 'TARGET_DIRECTORY' не определено. Кроме того, когда я добавляю' TARGET_DIRECTORY = $ (TargetDir) "в определения препроцессора, все макросы, определенные после него, игнорируются компилятором. Справка? – Nav

+2

Th ответ не работает, потому что он добавляет макрос, как TARGET_DIRECTORY "C: \ abc \". Правильно будет TARGET_DIRECTORY "C: \\ abc \\". По крайней мере моя Visual Studio не сбрасывает обратную косую черту. Это приводит к ошибкам компилятора, когда макрос используется в коде, потому что последняя обратная косая черта целевого каталога изменяет значение закрывающих двойных кавычек, и поэтому строка не будет закрыта в этой позиции. Я указал на это в своем ответе, который был проголосован. – Tom

+0

Nav: Ответ Тома дает ответ на вашу проблему. $ (TargetDir) заканчивается обратным слэшем. Таким образом, ваш конец> «<будет экранирован, поэтому определение не заканчивается в этой точке. – TheTrowser

-1

использование целевой_каталог = "" $ (TargetDir) "" вместо целевой_каталог = "$ (TargetDir)" для струнного макрокоманды. (Примечание двойные кавычки)

Работал для меня в VS2005.

Смежные вопросы