从源代码访问Visual Studio宏?

Nav*_*Nav 12 visual-studio-2010 visual-c++ visual-studio-macros

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

这只是一个临时要求,因此我可以将我的代码提供给一个人进行小型演示,并且他的TargetDirectory与我的目录不同.有没有办法在源代码中使用Visual Studio宏?(至少我知道可以访问系统环境变量)

Tom*_*Tom 10

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

TARGET_DIRECTORY=LR"($(TargetDir))"
Run Code Online (Sandbox Code Playgroud)

这定义了一个名为TARGET_DIRECTORY的宽字符串文字,其中包含$(TargetDir)宏的内容.这里重要的是,这会创建一个C++原始字符串,不会将反斜杠视为转义字符.路径包含反斜杠.使用常规字符串文字是不正确的,甚至在某些情况下会给你编译器错误.

重要!

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

TARGET_DIRECTORY=LR"|($(TargetDir))|"
Run Code Online (Sandbox Code Playgroud)

对于Windows文件系统路径,这不是必需的,因为路径不能包含双引号.


Jam*_*lis 7

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

<ItemDefinitionGroup>
  <ClCompile>
    <PreprocessorDefinitions>TARGET_DIRECTORY="$(TargetDirectory)"</PreprocessorDefinitions>
  </ClCompile>
</ItemDefinitionGroup>
Run Code Online (Sandbox Code Playgroud)

这可以在IDE中进行配置,方法是转到Project Property Pages对话框,浏览到Configuration Properties - > C/C++ - > Preprocessor Definitions,然后添加

TARGET_DIRECTORY="$(TargetDirectory)"
Run Code Online (Sandbox Code Playgroud)

请注意,+对字符串文字串联的使用是不正确的:字符串文字(和一般的C字符串)不能使用连接+.相反,字符串文字可以简单地通过将它们彼此相邻放置来连接.例如,

TARGET_DIRECTORY "..\\..\\abc.osg"
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不起作用,因为它添加了一个像TARGET_DIRECTORY"C:\ abc \"的宏.正确的是TARGET_DIRECTORY"C:\\ abc \\".至少我的Visual Studio不会自动转义反斜杠.当在代码中使用宏时,这会导致编译器错误,因为目标目录的最后反斜杠会更改结束双引号的含义,因此字符串将不会在此位置关闭.我在我的回答中指出了这一点. (2认同)