首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘分隔符’和'InheritsFromParent‘属性在.vsprops文件中意味着什么?

‘分隔符’和'InheritsFromParent‘属性在.vsprops文件中意味着什么?
EN

Stack Overflow用户
提问于 2008-09-27 01:27:41
回答 3查看 3.6K关注 0票数 8

我似乎无法从微软那里找到任何有用的文档,说明在Visual的属性表文件中定义用户宏时,如何在Delimiter元素中使用UserMacroInheritsFromParent属性。

下面是示例用法:

代码语言:javascript
复制
<UserMacro Name="INCLUDEPATH" Value="$(VCROOT)\Inc"
    InheritsFromParent="TRUE" Delimiter=";"/>

从上面的例子中,我猜想“继承”实际上意味着"a)如果定义是非空的,那么追加分隔符,以及( b)附加新的定义“,因为非继承行为只是简单地替换任何当前的宏定义。有人确切地知道吗?更好的是,是否有任何关于Visual .vsprops文件和宏的替代文档的建议源?

注意:这与VisualStudioPropertySheet元素的VisualStudioPropertySheet属性不一样,例如:

代码语言:javascript
复制
<VisualStudioPropertySheet ... InheritedPropertySheets=".\my.vsprops">

在这种情况下,“继承”的基本意思是“包括”。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-09-28 05:26:05

回答我自己的问题

InheritsFromParent的意思是优势。为了验证这一点,我做了一个实验,揭示了用户宏在Visual 2008中是如何工作的。下面是设置:

  • Project p.vcproj包括使用InheritedPropertySheets标记的属性表文件d.vsprops ('d‘表示派生)。
  • d.vsprops包括属性表文件b.vsprops ('b‘表示基)。
  • p.vcproj还定义了一个预构建事件,它转储环境。
  • 两个.vsprops文件都包含用户宏定义。

b.vsprops

代码语言:javascript
复制
...
<UserMacro Name="NOENV" Value="B"/>
<UserMacro Name="OVERRIDE" Value="B" PerformEnvironmentSet="true"/>
<UserMacro Name="PREPEND" Value="B" PerformEnvironmentSet="true"/>
...

d.vsprops

代码语言:javascript
复制
...
<VisualStudioPropertySheet ... InheritedPropertySheets=".\b.vsprops">
<UserMacro Name="ENV" Value="$(NOENV)" PerformEnvironmentSet="true"/>
<UserMacro Name="OVERRIDE" Value="D" PerformEnvironmentSet="true"/>
<UserMacro Name="PREPEND" Value="D" InheritsFromParent="true"
    Delimiter="+" PerformEnvironmentSet="true"/>
...

p.vcproj

代码语言:javascript
复制
...
<Configuration ... InheritedPropertySheets=".\d.vsprops">
<Tool Name="VCPreBuildEventTool" CommandLine="set | sort"/>
...

构建输出

代码语言:javascript
复制
...
ENV=B
OVERRIDE=D
PREPEND=D+B
...

根据这些结果,我们可以得出以下结论:

  1. 要在用于生成事件的环境中定义用户宏,必须使用PerformEnvironmentSet="true"。证明:NOENV未显示在生成输出中。
  2. 用户宏是,始终是从包含的属性表继承的,而不管是PerformEnvironmentSet还是InheritsFromParent。证明:在b.vsprops中,NOENV不在环境中设置,而在d.vsprops中使用时不需要InheritsFromParent
  3. 用户宏的简单重新定义将覆盖以前的任何定义。证明:OVERRIDE被设置为D,尽管它先前被定义为B
  4. InheritsFromParent="true" 重新定义用户宏会将新定义添加到以前的任何定义中,由指定的Delimiter隔开。证明:PREPEND设置为D+B (不是DB+D)。

下面是我为解释Visual .vsprops文件和相关主题找到的一些额外资源,这些资源来自几年前,但仍然很有帮助:

理解VC项目系统第一部分:文件和工具

理解VC项目系统第二部分:配置和项目属性页面对话框

理解VC项目系统第三部分:宏、环境变量和共享

理解VC项目系统第四部分:属性和属性继承

理解VC项目系统第五部分:构建、工具和依赖关系

理解VC项目系统第六部分:自定义构建步骤和构建事件

理解VC项目系统第七部分:"makefile“项目和(重新)使用环境

票数 9
EN

Stack Overflow用户

发布于 2008-09-27 17:14:50

这个这里的UI版本有一些文档。许多XML文件似乎有些无文档化,通常只是提供一个模式文件。你对它们的功能的猜测是完全正确的。

票数 0
EN

Stack Overflow用户

发布于 2011-02-15 12:51:17

这不是故事的全部。

  • 分隔符不是继承的。只有它们分隔的项列表是继承的:相同的用户宏可以在不同的属性表中有不同的分隔符,但只使用最后遇到的分隔符。(我写“最后一次遇到”是因为在项目级别上,我们不能指定分隔符,而且使用的是最后一个为该宏指定继承的属性表)
  • 只有由单个字符组成的分隔符才能工作。在某些情况下,超过一个字符的分隔符可能会删除其第一个字符和/或最后一个字符,这是错误地试图“加入”值列表。
  • $(继承)似乎在用户宏中工作。像骨料一样 属性时,它用作 父值,并且它可以多次出现。当没有找到$( inheritance )时,如果设置了继承标志,则在开始时隐含它。
  • $(NoInherit)似乎也可以在用户的宏中工作(使VC的行为像取消复选框一样)。
  • 当用于构造属性表的路径时,用户宏(和一些内置宏)似乎可以工作(VC自己的项目转换器使用该功能)。但是,用户宏在这种情况下获取的值并不总是直观的,特别是在其他包含的属性表中重新定义它时。
  • 一般来说,得到“继承”或连接的是公式,而不是值(即。您不能使用用户宏获取属性表中(例如) $(IntDir)的本地值的快照,并希望通过继承将该值“冒泡”,因为继承的实际上是公式"$(IntDir)",其值最终将在项目/配置/文件级别解析)。
  • 已经加载的属性表将被忽略(似乎避免同一个属性表将其用户宏聚合两次)。
  • "/“和"\”似乎都适用于属性表路径(以及VS期望路径的大多数地方)。
  • 以"/“开头的属性表路径(在宏被解析后)被假定在"./”中,其中'.‘。是调用表/项目的位置)。如果路径不以"./“、”./“或”驱动器:/“开头(UNC不知道),则相同。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/142708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档