”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > C/C ++中未使用的变量:为什么以及如何?

C/C ++中未使用的变量:为什么以及如何?

发布于2025-02-06
浏览:761

Unused variables in C/C  : why and how? 为什么变量未使用

有很多原因导致未使用变量可能保留在代码库中。这些包括:

错误和错误

:未使用变量的最明显原因是有缺陷的代码。要么根本不需要该变量,因此可以删除,或者是必要的,但我们忘记了在某些关键点使用它。

重构:
    作为软件的编写和重新编写,可以删除代码的整个部分。然后,曾经对代码至关重要的变量,例如辅助计算的结果,可能会被抛在后面,未使用。
  1. 条件汇编:

    变量可能取决于预处理器阶段。标准示例是仅出于调试目的而定义的变量。您的代码可能包含一些表单

  2. const auto value = compute_some_value(); const auto value_for_comparison_only = compute_same_value_differy(); assert(value == value_for_comparison_only);

    如果您使用-dndebug编译,则编译器可能会警告您value_for_for_comparison_only从未使用过:的确,assert语句已被…没有。 如何检测未使用的变量

  3. 不同的编译器和警告级别设置可能会影响编译过程中是否没有使用变量。
  4. 例如,GCC和Clang具有-wunused -variable标志,它触发了有关未使用变量的警告。标志已经由-wall警告选项暗示,并且可以通过-wno -unused -variable关闭。 我的建议是始终使用-wall编译,然后选择性地将警告视为允许的。这将所有未使用变量的实例。

    如何不检测未使用的变量:属性

    虽然我们始终应启用尽可能多的警告,但在某些情况下,我们需要选择性地关闭有关特定未使用变量的警告。这样做的一种流行的方式是使其无效:
  5. 对象Unused_Object; (void)unused_object; void的演员阵容将变量的用法计数为(pro forma),因此不会发出任何警告。
    虽然删除了Unused_object未使用的警告,但如有预期,有一些改进的方法。我们希望具有明确的语义,以表示无用的对象。一种常见的方法是通过定义宏:

#定义未使用(x)(void)(x); // ... 对象Unused_Object; 未使用(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]]属性:

对象Unused_Object2 __attribute __(((unused)))= x; //应在声明后放置 [[MASE_UNUSED]]对象Unused_Object1 = X; //必须在声明之前放置

这些属性与编译器(以及我们)交流这些变量可能未使用,并且我们对此很好。

历史上,海湾合作委员会属性首先出现,是C和C中的编译器特定语言扩展。从C 17开始,属性是语言标准的一部分。但是,不仅拼写不同,而且标准和GCC扩展不同意将属性放置在哪里。

[[MASE_UNUSED]]属性将通过条件编译找到其大多数应用程序。例如,它是仅调试变量的自然属性。出于纯粹的美学原因,我个人更喜欢定义一个宏#define and_unused [[bays_unused]]。

__attribute __(((未使用))的优点是,如果代码中使用该变量,它实际上会警告您。它不是

,但

绝对从未使用过,现在使用变量会产生警告。

保留无用的东西

显然,未使用的变量频繁且重要,甚至足以保证自己的语言扩展。
Object unused_object;
(void)unused_object;
从比较中,评论未使用的变量是一个很好的策略?并非总是!在整个开发代码和调试阶段中,您会保留未使用的变量的原因。假设该变量是在过去版本的代码中使用的,也许您甚至还没有决定是否应该搁置或重新整合旧代码;含义:您不知道您是否可能再次需要未使用的变量。

可能有助于调试目的保留代码:


auto Unused_variable __attribute __(((unused))=复杂的_calculation(arg1,arg2,arg3);
const auto value = compute_some_value();
const auto value_for_comparison_only = compute_same_value_differently();
assert( value == value_for_comparison_only );
即使从未使用复杂的计算结果,将其围绕它构成了另一个失败点……这正是您在调试期间想要的。即使不是原本打算调试的目的,如果您决定再次需要它,则该程序初始化此变量也会有所帮助。

我希望这篇关于未使用变量的文章对您有用。

版本声明 本文转载于:https://dev.to/martinlicht/unused-variables-in-cc-why-and-how-4cm4如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Python不会对超范围子串切片报错的原因
    Python不会对超范围子串切片报错的原因
    在python中用索引切片范围:二重性和空序列索引单个元素不同,该元素会引起错误,切片在序列的边界之外没有。这种行为源于索引和切片之间的基本差异。索引一个序列,例如“示例” [3],返回一个项目。但是,切片序列(例如“示例” [3:4])返回项目的子序列。索引不存在的元素时,例如“示例” [9] ...
    编程 发布于2025-04-29
  • 在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8表中将latin1字符转换为utf8 ,您遇到了一个问题,其中含义的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致电。为了解决此问题,您正在尝试使用“ mb_convert_encoding”和“ iconv”转换受...
    编程 发布于2025-04-29
  • JavaScript中如何动态访问全局变量?
    JavaScript中如何动态访问全局变量?
    在JavaScript 一种方法是使用窗口对象存储和检索变量。通过引用全局范围,可以使用其名称动态访问变量。 //一个脚本 var somevarname_10 = 20; //另一个脚本 window.all_vars = {}; window.all_vars ['somevarnam...
    编程 发布于2025-04-29
  • 如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求模拟浏览器行为,以及伪造的用户代理提供了一个用户 - 代理标头一个有效方法是提供有效的用户式header,以提供有效的用户 - 设置,该标题可以通过browser和Acterner Systems the equestersystermery和操作系统。通过模仿像Chro...
    编程 发布于2025-04-29
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-04-29
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-04-29
  • VSCode在Go模板中显示CSS验证错误的原因
    VSCode在Go模板中显示CSS验证错误的原因
    在使用GO的html/template软件包和编写诸如mypage.tmpl之类的编写模板时,对VSCODE中的CSS错误进行故障排除。 mypage.tmpl:可以触发以下错误: 尝试在样式的html attribute。 settings。搜索“ html.validate.styles”。将其...
    编程 发布于2025-04-29
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-04-29
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-04-29
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 中,如果您使用一个大文件,并且需要从最后一行读取其内容,则在第一行到第一行,Python的内置功能可能不合适。这是解决此任务的有效解决方案:反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] ...
    编程 发布于2025-04-29
  • 如何检查对象是否具有Python中的特定属性?
    如何检查对象是否具有Python中的特定属性?
    方法来确定对象属性存在寻求一种方法来验证对象中特定属性的存在。考虑以下示例,其中尝试访问不确定属性会引起错误: >>> a = someClass() >>> A.property Trackback(最近的最新电话): 文件“ ”,第1行, AttributeError: SomeClass...
    编程 发布于2025-04-29
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-04-29
  • Python实现键盘输入超时功能的技巧
    Python实现键盘输入超时功能的技巧
    等待超时输入键盘输入用户输入检索过程可能会耗时,尤其是在使用大量数据时。为了防止过度等待,希望在输入提示期间实现超时。一个解决方案涉及利用选择调用。此方法是简洁且可移植的:导入sys,选择 打印(“您有十秒钟可以回答!”) #将`timeout'指定为10秒 i,o,e = select....
    编程 发布于2025-04-29
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-04-29
  • 如何从2D数组中提取元素?使用另一数组的索引
    如何从2D数组中提取元素?使用另一数组的索引
    Using NumPy Array as Indices for the 2nd Dimension of Another ArrayTo extract specific elements from a 2D array based on indices provided by a second ...
    编程 发布于2025-04-29

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3