【问题标题】:Make a variable unavailable in portion of codes使变量在部分代码中不可用
【发布时间】:2011-07-22 04:01:20
【问题描述】:

有时,作为安全检查,我想检查变量 v 是否未在代码的某些部分或某些函数的其余部分中使用,即使它在范围内仍然可见这个函数/部分代码的。例如:

int x;
// do something with x 
DEACTIVATE(x);
// a portion of code which should not use x
ACTIVATE(x);
// do something else with x

有没有在编译时执行这种类型验证的好方法?

注意:我知道应该始终为每个变量使用尽可能小的范围,但在某些情况下,将这种做法推向极端可能会变得很麻烦,而这样的工具会很有用的。

谢谢!

【问题讨论】:

  • 这没什么用...但是您为什么不实际编写代码,以便所有内容都正确确定范围并且您一开始就没有问题?
  • @Mark:这只是为了执行安全检查:当出现问题时,它们会非常有用。当然,如果你从一开始就编写完美的代码,你就不需要它们。但我猜你没有。

标签: c++ variables scope


【解决方案1】:

使用

#define v @
..
#undef v

应该这样做,因为@ 与任何其他变量名称或关键字或运算符冲突的可能性非常低。

【讨论】:

  • 我个人的看法是,除了最简单的情况外,“概率”编译在所有情况下都是毫无价值的。该解决方案也没有考虑更复杂的变量类型。此解决方案更像是一种 hack,而不是完成任务的正确方法。
  • 其实@这个符号没有任何意义,除非它已经被定义了。当然,这是一个 hack,但提出问题的方式并没有给如何实现它留下太多选择。
  • 据我所知,您只是用 C++ 代码中不能出现的符号替换变量的名称。这很好,没有任何概率。
【解决方案2】:

实现这一点的最佳方法是在您的代码中实际使用小范围,即使用短而专注的方法,只做一件事。这样一来,每个单独的方法往往只有很少的局部变量,并且一旦您不需要它们,它们就会自动超出范围。

如果您有很长的遗留方法让您担心这个问题,最好的长期解决方案是通过将较小的功能块提取到单独的方法中来重构它们。大多数现代 IDE 都具有自动重构支持,从而降低了通过此类更改引入错误的风险 - 尽管最好的当然是拥有一组适当的单元测试以确保您不会破坏任何东西。

推荐阅读是Clean Code

【讨论】:

  • 我知道应该始终为每个变量使用尽可能小的范围,但在某些情况下,将这种做法推向极端可能会变得很麻烦,而这样的工具会很有用。
  • @Greg,定义“extreme” :-) 对我来说,尝试分析一个冗长而复杂的方法是很麻烦的,重构它以使其更简洁是值得的。 YMMV。
【解决方案3】:

据我所知,没有这样的编译验证。也许您可以使用 grep 自己验证它。我认为最好的方法是将您的功能分成两个功能。一个使用变量,另一个看不到变量。这就是我们需要函数的原因之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2014-05-03
    • 2021-12-09
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多