在特定作用域中使变量无法访问,是否可行?

3

有没有一种方法可以禁用特定范围内变量的所有访问?

它的用法可能类似于这个例子:-

int outerOnly=5; //primitive or class or struct, it can also be a field
outerOnly=4;  //ok
{//vvv The disable command may be in a block?
    disable outerOnly; //<--- I want some thing like this.
    outerOnly=4; //should compile error (may be assert fail?)
    int c=outerOnly;  //should compile error
}
outerOnly=4;  //ok

如果答案是否定的,是否有最接近这个功能的特性?
在调试的一些情况下很有用。
编辑:例如,我确定某个范围(也太独特了,不可能是一个函数)绝不能访问单个特定变量。

2
不,你不能做任何类似的事情,我也不确定是否有类似的东西。调试方面无法提供任何帮助,因为断点和日志记录可能已经提供了所需的信息。 - Sami Kuhmonen
1
你能做的最接近的事情是将那个内部块移动到它自己的函数中(尽管全局变量仍然可以访问)。 - Cornstalks
"这在一些调试情况下会很有用。" - 我不这么认为。 - Christian Hackl
例如,我确定某个范围(也太独特了,不可能是一个函数)绝不能访问单个特定变量。如果您的代码非常复杂,以至于认为这样一个可怕的黑客技巧会很有用,请重构您的代码,使得变量不会意外地出现在错误的范围内而不会导致编译错误。那么,“太独特而无法成为函数”到底是什么意思呢? - Christian Hackl
@Christian Hackl "too unique to be a function" = 如果它变成一个函数,它只会被调用一次。这个函数可能还需要访问调用者的一些局部变量,因此我必须手动传递它们。因此,在我看来,我认为将其作为一个函数并不是很合适。 - javaLover
4个回答

6
考虑实现类似这样的东西(也许需要删除复制构造函数和赋值运算符):
struct disable
{
private:
    disable(const disable&) = delete;
    disable& operator=(const disable&) = delete;
public:
    disable() {}
};

然后,将其放置。
disable outerOnly;

在内部范围内做操作会产生所需的错误。

请注意,正如@Cornstalks所评论的那样,这可能会导致与阴影相关的编译器警告(反过来,可以基于情况逐个禁用这些警告)。


2
请注意,这可能会导致警告与影子定义有关,具体取决于您的编译器设置。 - Cornstalks
感谢AlexD。+1 是否也有可能避免编译器中提到的警告(由Cornstalks提出)? - javaLover
1
我建议使用宏来进行条件编译。#define DISABLE(var) disable var; 至少可以在正确的 -D 选项下实现无警告构建。 - StoryTeller - Unslander Monica
“can usually be disabled on case by case basis”是什么意思?你是指逐行禁用吗?如何操作?我对C++还很陌生。 - javaLover
1
@javaLover 你可以创建一个宏,它将(1)保存设置;(2)禁用具体的警告;(3)执行 disable(var);(4)恢复设置。这样,你就不需要完全禁用警告,因为在其他情况下可能会有用。查看你的编译器中的 #pragma - AlexD
@Cornstalks 谢谢!我已经将它添加到帖子中了。 - AlexD

2

有没有一种方法可以禁止某个特定作用域中的所有访问变量的方式?

不,没有这样的功能。

如果答案是否定的,那么最接近这个功能的功能是什么?

与其使用简单的块,您可以定义并调用一个不捕获不需要的变量的闭包:

int outerOnly;
int innerToo;
[&innerToo]()
{
    innerToo  = 42;        // ok
    outerOnly = 4;         // fails to compile
    int c     = outerOnly; // fails to compile
}();

1

只需简单地执行struct Outeronly;

请注意,如果不熟悉错误信息,可能会感到困惑。


1
这里是一个相当直接的解决方案:
int main()
{
        int outerOnly=5; //primitive or class or struct, it can also be a field
        outerOnly=4;  //ok
        #define outerOnly outerOnly_disabled
        //outerOnly=4; //error outerOnly_disabled is not declared
        //int c=outerOnly;  //error 
        #undef outerOnly

        outerOnly=4;  //ok
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接