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
は、構造体とコードを定義します。
デバッガーで条件付きブレークポイントを設定します。そうすれば、それが変わるかどうかがわかります。また、変数を頻繁にスキャンして変更を警告する「ウォッチドッグ」タイプのスレッドを作成することもできますが、それはすぐにはできません。
これらはどちらも直接の範囲内ではありませんがC
、var が誤って変更されたかどうかを判断するのに役立ちます。
あなたがそれを行うことができる唯一の方法は
(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 );
}