C - 如何保护变量在某一点后不被意外更改:
例如,在一个 C 程序中,我声明了一个整数,并在程序的第一部分多次更改了它的值。但是在某个点之后,我想防止其值被意外更改,或者至少在发生任何更改其值的尝试时得到警告。我怎么做?
C - 如何保护变量在某一点后不被意外更改:
例如,在一个 C 程序中,我声明了一个整数,并在程序的第一部分多次更改了它的值。但是在某个点之后,我想防止其值被意外更改,或者至少在发生任何更改其值的尝试时得到警告。我怎么做?
你不能。
一种可能的解决方案是将修改变量的函数部分移动到单独的函数中。该函数将返回可用于初始化变量的const
变量的值:
int determine_value_of_a()
{
int result = 0;
/* Modifications of result. */
return result;
}
void f()
{
const int a = determine_value_of_a();
}
如果使用预处理器宏是可以接受的,那么您可以这样做:
{ // 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
}
不过,一般来说,我不会推荐它。如果你不能相信单个函数的主体能够正确地做事,那么这个函数就太复杂了,应该重新构造,比如通过调用另一个函数来提供对象的值。
将变量放在一个不透明的结构中,并指示它是否可以更改。从函数访问变量,以获取和更改值。如果可变性指示如果关闭,则该功能不允许更改
#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
定义了结构和代码。
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.
} }
你能做到的唯一方法是
(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 );
}
在调试器中对其设置条件断点。然后你就会知道它是否会改变。您还可以编写一个“看门狗”类型的线程,它会经常扫描您的 var 并在更改时发出警告,但这不会立即生效。
这些都不在C
直接的范围内,但可以帮助您确定您的 var 是否被错误地更改。