为什么变量未使用
有很多原因导致未使用变量可能保留在代码库中。这些包括:
:未使用变量的最明显原因是有缺陷的代码。要么根本不需要该变量,因此可以删除,或者是必要的,但我们忘记了在某些关键点使用它。
重构:变量可能取决于预处理器阶段。标准示例是仅出于调试目的而定义的变量。您的代码可能包含一些表单
如果您使用-dndebug编译,则编译器可能会警告您value_for_for_comparison_only从未使用过:的确,assert语句已被…没有。 如何检测未使用的变量
如何不检测未使用的变量:属性
虽然我们始终应启用尽可能多的警告,但在某些情况下,我们需要选择性地关闭有关特定未使用变量的警告。这样做的一种流行的方式是使其无效:对象Unused_Object;
(void)unused_object;
void的演员阵容将变量的用法计数为(pro forma),因此不会发出任何警告。
虽然删除了Unused_object未使用的警告,但如有预期,有一些改进的方法。我们希望具有明确的语义,以表示无用的对象。一种常见的方法是通过定义宏:
const auto value = compute_some_value(); const auto value_for_comparison_only = compute_same_value_differently(); assert( value == value_for_comparison_only );一个优点是,我们现在明确地传达了此变量的意图(或缺乏意图)。此外,如果我们决定清除未使用变量的代码,那么搜索它们要容易得多。
超越宏,我们有可变属性:语言c的本地或作为C/C编译器提供的语言扩展。例如,clang和GCC允许变量属性__Attribute __(((未使用))。 C 17支持[[MASE_UNUSED]]属性:
这些属性与编译器(以及我们)交流这些变量可能未使用,并且我们对此很好。
历史上,海湾合作委员会属性首先出现,是C和C中的编译器特定语言扩展。从C 17开始,属性是语言标准的一部分。但是,不仅拼写不同,而且标准和GCC扩展不同意将属性放置在哪里。
[[MASE_UNUSED]]属性将通过条件编译找到其大多数应用程序。例如,它是仅调试变量的自然属性。出于纯粹的美学原因,我个人更喜欢定义一个宏#define and_unused [[bays_unused]]。__attribute __(((未使用))的优点是,如果代码中使用该变量,它实际上会警告您。它不是
,但
保留无用的东西
Object unused_object; (void)unused_object;从比较中,评论未使用的变量是一个很好的策略?并非总是!在整个开发代码和调试阶段中,您会保留未使用的变量的原因。假设该变量是在过去版本的代码中使用的,也许您甚至还没有决定是否应该搁置或重新整合旧代码;含义:您不知道您是否可能再次需要未使用的变量。
可能有助于调试目的保留代码:
const auto value = compute_some_value(); const auto value_for_comparison_only = compute_same_value_differently(); assert( value == value_for_comparison_only );即使从未使用复杂的计算结果,将其围绕它构成了另一个失败点……这正是您在调试期间想要的。即使不是原本打算调试的目的,如果您决定再次需要它,则该程序初始化此变量也会有所帮助。
我希望这篇关于未使用变量的文章对您有用。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3