[回答我自己的问题]
InheritsFromParent
意味着前置。为了验证这一点,我做了一个实验来揭示用户宏在 Visual Studio 2008 中是如何工作的。下面是设置:
- 项目包括使用标签
p.vcproj
的属性表文件d.vsprops
(“d”表示派生) 。InheritedPropertySheets
d.vsprops
包括属性表文件b.vsprops
('b' 表示base。)
p.vcproj
还定义了转储环境的预构建事件。
- 这两个
.vsprops
文件都包含用户宏定义。
b.vsprops
...
<UserMacro Name="NOENV" Value="B"/>
<UserMacro Name="OVERRIDE" Value="B" PerformEnvironmentSet="true"/>
<UserMacro Name="PREPEND" Value="B" PerformEnvironmentSet="true"/>
...
d.vsprops
...
<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
...
<Configuration ... InheritedPropertySheets=".\d.vsprops">
<Tool Name="VCPreBuildEventTool" CommandLine="set | sort"/>
...
构建输出
...
ENV=B
OVERRIDE=D
PREPEND=D+B
...
根据这些结果,我们可以得出以下结论:
PerformEnvironmentSet="true"
在用于构建事件的环境中定义用户宏是必需的。证明:NOENV
构建输出中未显示。
- 用户宏总是从包含的属性表继承而来,不管
PerformEnvironmentSet
或InheritsFromParent
。证明: in b.vsprops
,NOENV
没有设置在环境中, ind.vsprops
不需要InheritsFromParent
.
- 用户宏的简单重新定义会覆盖任何先前的定义。证明:
OVERRIDE
设置为D
尽管它之前被定义为B
。
- 重新定义用户宏
InheritsFromParent="true"
将新定义添加到任何先前的定义之前,由指定的Delimiter
. 证明:PREPEND
设置为D+B
(not D
or B+D
.)
以下是我发现的一些附加资源,用于解释 Visual Studio.vsprops
文件和相关主题,它是几年前的,但它仍然很有帮助:
了解VC项目系统第一部分:文件和工具
了解 VC 项目系统第二部分:配置和项目属性页对话框
了解VC项目系统第三部分:宏、环境变量和分享
了解VC项目系统第四部分:属性和属性继承
理解VC项目系统第五部分:构建、工具和依赖
了解VC项目系统第六部分:自定义构建步骤和构建事件
了解 VC 项目系统第七部分:“makefile”项目和(重新)使用环境