从源代码访问Visual Studio宏?

15

Visual Studio有像$(TargetDirectory)$(OutputPath)等宏。
在我的源代码中,我想指定一个相对路径,从一个比TargetDirectory下几个级别的文件夹加载文件。
目前我这样做:mLayer = mEngine->AddLayer("D:\\Projects\\abc.osg"); 我希望它成为像这样的东西:mLayer = mEngine->AddLayer(($TargetDirectory)+"..\\..\\abc.osg");

这只是一个临时需求,以便我可以向一个人展示一个小演示,而他的TargetDirectory与我的目录不同。有没有办法在源代码中使用Visual Studio宏?(至少我知道可以访问系统环境变量)

6个回答

13

转到项目属性 -> 配置属性 -> C/C++ -> 预处理器 -> 预处理器定义,并添加以下内容:

TARGET_DIRECTORY=LR"($(TargetDir))"

这定义了一个名为TARGET_DIRECTORY的宽字符串字面值,其中包含$(TargetDir)宏的内容。重要的是,这创建了一个C++原始字符串,不将反斜杠视为转义字符。路径包含反斜杠。使用普通字符串字面值是错误的,甚至在某些情况下会导致编译器错误。

重要提示!

如果您使用可能包含右括号后跟双引号“)”的宏,则必须使用附加分隔符,该分隔符不能出现在宏值中,例如:

TARGET_DIRECTORY=LR"|($(TargetDir))|"
在Windows文件系统路径的情况下,这是不必要的,因为路径不能包含双引号。

不行。不起作用。我试图输出TARGET_DIRECTORY,但出现了以下错误:“error C2065: 'LR' : 未声明的标识符”,“error C2143: 语法错误:缺少';' before 'string'”,“error C2563: 形式参数列表不匹配”。 - Nav
1
好的,看起来原始字符串是在C++11中引入的,并且在VS 2010中不可用。抱歉。它可以在VS 2013中工作。 - Tom
与VS2017完美兼容。 - Sirmabus

7

您无法自动执行此操作,但可以将特定的MSBuild属性传递给预处理器:

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

可以通过在IDE中转到项目属性页面对其进行配置,浏览到“配置属性 -> C/C++ -> 预处理器定义”,然后添加。

TARGET_DIRECTORY="$(TargetDirectory)"

请注意,使用+进行字符串文字串联是不正确的:字符串文字(以及一般的C字符串)不能使用+进行拼接。相反,可以通过将字符串文字相邻地放置来进行串联。例如,
TARGET_DIRECTORY "..\\..\\abc.osg"

我无法在代码中使用宏。编译器报告TARGET_DIRECTORY未定义。此外,当我将TARGET_DIRECTORY="$(TargetDir)"添加到预处理器定义中时,其后定义的所有宏都被编译器忽略。可以帮忙吗? - Nav
3
这个回答不可行,因为它添加了一个类似于TARGET_DIRECTORY "C:\abc"的宏定义。正确的方式应该是TARGET_DIRECTORY "C:\abc\"。至少我的Visual Studio没有自动转义反斜杠。当这个宏在代码中被使用时,最后一个反斜杠会改变结束双引号的含义,导致编译器错误,从而字符串在此处未被关闭。我在我的回答中指出了这一点,但是被投票降低了分数。 - Tom
Nav: Tom的回答给出了你的问题的答案。$(TargetDir)以反斜杠结尾。因此,你的结束符">"<将被转义。因此,该定义在那一点上并没有结束。 - TheTrowser

1

在属性 -> 配置属性 -> C/C++ -> 预处理器 -> 预处理器中,可以添加您的指令。

PROJECT_DIR=R"($(ProjectDir))"

在编程中,您可以像这样使用它:

std::string com = "powershell groovy "PROJECT_DIR"generate_report.groovy " + EXE_DIR;

EXE_DIR 是一个字符串,在我们的情况下。


-1

-1

我不知道有没有其他方法,但我有一个替代方案。

将您的文件部署为后置构建步骤。在此步骤中,您可以使用 $(OutDir) 宏,该宏表示您的二进制文件放置文件夹。这应该可以帮助您将此文件放置在相对位置,并在代码中使用该相对位置。

这也将是一种持久的解决方案,而不是临时解决方案。


-1

在字符串宏中,使用TARGET_DIRECTORY=""$(TargetDir)""而不是TARGET_DIRECTORY="$(TargetDir)"。 (请注意双引号)

在VS2005中对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接