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

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

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

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]删除
最新教程 更多>
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-04-07
  • 为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    网格超过身体,用100%grid-template-columns 为什么在grid-template-colms中具有100%的显示器,当位置设置为设置的位置时,grid-template-colly修复了?问题: 考虑以下CSS和html: class =“ snippet-code”> g...
    编程 发布于2025-04-07
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-04-07
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-04-07
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-07
  • 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-07
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-04-07
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-04-07
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-04-07
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-04-07
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-04-07
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    将pandas dataframe列转换为dateTime格式示例:使用column(mycol)包含以下格式的以下dataframe,以自定义格式:})指定的格式参数匹配给定的字符串格式。转换后,MyCol列现在将包含DateTime对象。 date date filtering > = p...
    编程 发布于2025-04-07
  • 在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    mysql-python安装错误:“ mysql_config找不到”“ 由于缺少MySQL开发库而出现此错误。解决此问题,建议在Ubuntu上使用该分发的存储库。使用以下命令安装Python-MysqldB: sudo apt-get安装python-mysqldb sudo pip in...
    编程 发布于2025-04-07
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-04-07

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

Copyright© 2022 湘ICP备2022001581号-3