众所周知,在C中,浮点文字(例如1.23
)具有类型double
.因此,任何涉及它们的计算都会提升到两倍.
我正在研究一个嵌入式实时系统,它有一个浮点单元,只支持单个precision(float
)数字.我的所有变量都是float
,这个精度就足够了.我根本不需要(也买不起)double
.但每次都喜欢
if (x < 2.5) ...
Run Code Online (Sandbox Code Playgroud)
写的,灾难发生:减速可以达到两个数量级.当然,直接的答案是写
if (x < 2.5f) ...
Run Code Online (Sandbox Code Playgroud)
但这很容易被遗漏(并且直到太晚才难以发现),尤其是当一个"配置"值被#define
一个不那么自律(或刚刚开发)的开发人员放在一个单独的文件中时.
那么,有没有办法强制编译器将所有(浮点)文字视为float,就像使用后缀一样f
?即使它违反了规范,我也不在乎.或任何其他解决方案?顺便说一句,编译器是gcc.
我有一种淡出动画控件的样式:
<Style x:Key="ExpireFadeStyle">
<Style.Resources>
<!--Change this in a derived style if required-->
<sys:Double x:Key="FinalVal">0.25</sys:Double>
</Style.Resources>
<Style.Triggers>
<DataTrigger Binding="{Binding IsExpired}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard x:Name="ExpireAnimation">
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity"
From="1" To="{StaticResource FinalVal}" Duration="0:0:3" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<StopStoryboard BeginStoryboardName="ExpireAnimation" />
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)
(该IsExpired
属性始终存在于DataContext
应该使用样式的控件的中。)
当我直接在控件中使用此样式时,一切正常:
<StackPanel Style="{StaticResource ExpireFadeStyle}">
...etc
Run Code Online (Sandbox Code Playgroud)
但是当我从这种风格中衍生出来时,就像
<Style x:Key="ExpireTextFadeStyle" BasedOn="{StaticResource ExpireFadeStyle}"/>
Run Code Online (Sandbox Code Playgroud)
...然后在相同控件上以相同方式使用派生样式,则不起作用。(当然是要对它进行一些更改,尤其是FinalVal
,但它必须首先在平凡的情况下起作用)。
继承的样式本身似乎确实起作用:如果在其中添加一些样式Setter
,则会看到其效果。似乎Triggers
没有继承或根本不起作用。如何解决呢?