2

C - 如何保护变量在某一点后不被意外更改:

例如,在一个 C 程序中,我声明了一个整数,并在程序的第一部分多次更改了它的值。但是在某个点之后,我想防止其值被意外更改,或者至少在发生任何更改其值的尝试时得到警告。我怎么做?

4

6 回答 6

13

你不能。

一种可能的解决方案是将修改变量的函数部分移动到单独的函数中。该函数将返回可用于初始化变量的const变量的值:

int determine_value_of_a()
{
    int result = 0;
    /* Modifications of result. */
    return result;
}

void f()
{
    const int a = determine_value_of_a();
}
于 2013-05-03T15:38:36.120 回答
2

如果使用预处理器宏是可以接受的,那么您可以这样做:

{ // Function body starts here.
    int x = …;
    … // Change x as desired here.
    const int y = x;
    #define x y;
    … // “x” is actually the const y here.
    #undef x
}

不过,一般来说,我不会推荐它。如果你不能相信单个函数的主体能够正确地做事,那么这个函数就太复杂了,应该重新构造,比如通过调用另一个函数来提供对象的值。

于 2013-05-03T15:48:16.380 回答
1

将变量放在一个不透明的结构中,并指示它是否可以更改。从函数访问变量,以获取和更改值。如果可变性指示如果关闭,则该功能不允许更改

#include "swinger.h"

int main(void) {
    struct moodswinger *var;

    var = newswinger();
    setvar(var, 42);
    getvar(var);
    swing(var, 0);
    setvar(var, -1); /* oops */
}

该文件swinger.h声明了函数。
该文件swinger.c定义了结构和代码。

于 2013-05-03T15:47:42.807 回答
1
int x;
x = …; // This is okay.
{
    const int y = x; // Make a copy of x.
    {
        const int x = y; // Make a const copy of x that hides the original.
        /*  The compiler should produce a diagnostic if you
            attempt to modify x here.
        */
    }
}

或者,如果您不想更改缩进:

int x;
x = …;
{ const int y = x; { const int x = y;
…; // x is const here.
} }
于 2013-05-06T00:26:06.547 回答
0

你能做到的唯一方法是

(a) 使用函数来初始化变量..

int main( int argc, char** argv )
{
    const int myVar = initMyVar();

    ...
}

或 (b) 将变量传递给执行其他工作的另一个函数......

void myWorkerFunc( const int myVar )
{
    ...
}

int main( int argc, char** argv )
{
    int myVar = initMyVar();

    ...

    myWorkerFunc( myVar );
}
于 2013-05-03T15:41:42.833 回答
0

在调试器中对其设置条件断点。然后你就会知道它是否会改变。您还可以编写一个“看门狗”类型的线程,它会经常扫描您的 var 并在更改时发出警告,但这不会立即生效。

这些都不在C直接的范围内,但可以帮助您确定您的 var 是否被错误地更改。

于 2013-05-03T15:42:34.273 回答